@Override public void render(Object o) { Graphics2D g2 = (Graphics2D) o; // Clear the background g2.setColor(Color.BLACK); g2.fillRect(0, 0, 800, 600); // 1. clip office work to draw. // 800x300 Office world from (0, 0) // draw background(s) // draw all of the office furniture/people // draw the demon // If one is viewing the tasks window, render the tasks. Graphics2D officeRender = (Graphics2D) g2.create(0, 0, 800, 300); // reset the graphics // Draw the background officeRender.drawImage(coolParallaxScrolling, -parallaxOffset, 0, null); officeRender.drawImage(coolParallaxScrolling, 800 - parallaxOffset, 0, null); officeRender.drawImage(coolParallaxScrolling, -parallaxOffset, 100, null); officeRender.drawImage(coolParallaxScrolling, 800 - parallaxOffset, 100, null); int offset = ((int) camera.getXLocation()) % officeBackgroundRepeated.getWidth(); for (int i = 0; i < ((officeBackgroundRepeated.getWidth() / 800) + 1); i++) { officeRender.drawImage( officeBackgroundRepeated, (int) (-offset + (i * officeBackgroundRepeated.getWidth())), 100, null); } for (int i = 0; i < officeWorld.getEntities().size(); i++) { officeWorld.getEntities().get(i).render(officeRender); } officeRender.dispose(); // 2. clip task world to draw. // 400x300 task world from (200, 300) // If there is an active task, draw it // Otherwise, draw a placeholder(?) Graphics2D taskRender = (Graphics2D) g2.create(200, 300, 400, 300); /// for (int j=0; j<toDoList.size(); j++) { /// toDoList.get(j).render(g2); // pass the clipped graphics in /// } if (activeTask != null) { // find what task needs to be done next activeTask.render(taskRender); if (!isCompletedWithTasks() && activeTask != toDoList.get(nextTaskIndex) && !activeTask.isComplete() && !(activeTask instanceof HitImpTask) && !(activeTask instanceof InterviewTask) && !(activeTask instanceof PaperworkTask)) { // prompt that the task is visited too early taskRender.drawImage(canNotDoYetPrompt, 0, 0, null); } } else { // Whatever is there with no task } taskRender.dispose(); if (isFinishedWithDailyThings() && !viewingCompletedDay) { // SoundPlayer.getSoundPlayer().playVictoryMusic(); SoundPlayer.getSoundPlayer().setMusicTo(SoundPlayer.NONE); SoundPlayer.getSoundPlayer().playVictoryMusic(); viewingCompletedDay = true; } // draw the to-do list on top of everything if (viewingTasks) { // View all of the tasks. } gui.render(o); // Draw borders g2.drawImage(border, 0, 300, null); g2.drawImage(border2, 196, 306, null); g2.drawImage(border2, 598, 306, null); // render employee status gui according to what state they're in. for (int i = 0; i < workers.length; i++) { g2.drawImage(workerHeadsIcon[(workers[i].getState())], 495 + (50 * i), 10, null); } BufferedImage dayImg = getAssetManager().getImage("day" + (dayOn + 1)); if (dayImg != null) { g2.drawImage(dayImg, 10, 10, null); } // draw the alert GUI warning about an imp attack for (int i = 0; i < impTaskObjects.size(); i++) { int yPos = 30 + (i * 25); int xPos = (int) (impTaskObjects.get(i).getX() - camera.getXLocation()); // contain it to the screen so one can see what direction to go. if (xPos < 10) { xPos = 10; } else if (xPos > 730) { xPos = 770; } g2.drawImage(impAlertImage, xPos, yPos, null); } // Draw an imp that is flying across the screen if (showImp) { g2.drawImage( impImage, impXLoc - (impImage.getWidth() / 2), (int) ((((float) ((impXLoc - 400) * (impXLoc - 400))) / 1000) + 150) - (impImage.getHeight() / 2), null); } if (viewingCompletedDay) { // g2.drawImage(completeDay, 200, 150, null); } // draw the todolist last to go on top todoListGuiElement.render(o); /* Debugging things */ /* g2.setColor(Color.WHITE); g2.fillRect(0, 0, 150, 50); g2.setColor(Color.BLACK); g2.drawString("activeTask: " + activeTask, 10, 20); g2.drawString("paperworkLeft: " + paperworkLeft, 10, 30); */ }
@Override public void update(int delta) { if (viewingCompletedDay) { viewingDayTime += delta; if (viewingDayTime >= 4000) { advanceDay(); } return; } tickProgress += delta; if (tickProgress >= ticksPerHour) { advanceHour(); tickProgress = 0; } // 1. update office world officeWorld.updateEntities(delta); // update paperwork paperworkLeft -= (getNumWorkerAlive() * EMPLOYEE_WORK_RATE); if (paperworkLeft < 0) { paperworkLeft = 0; } // imp spawning currImpAttackTime += delta; if (currImpAttackTime > impWaitTimeCurrent && getNumWorkerAlive() != 0) { // there must be workers alive to spawn an imp on one // make an imp randomly attack // make a random worker fall asleep if (Math.random() > 0.5) { // 50% chance to spawn at time limit // randomly chose a non-dead worker int whichOne = 0; int iterations = 0; // prevent infinite loop do { whichOne = (int) (Math.random() * workers.length); iterations++; } while (iterations >= 50 && // safe lock to stop the loop after 100 times. workers[whichOne].getState() != Employee.WORKING && !workers[whichOne].isBeingAttackedByImp()); if (!workers[whichOne].isBeingAttackedByImp() && workers[whichOne].getState() == Employee.WORKING && iterations < 50) { // only spawn an imp if iterations did not go out too far // define the task and add it to the list of tasks to be updated HitImpTask impTask = new HitImpTask(this, workers[whichOne]); ImpAttackTaskObject impTaskObject = new ImpAttackTaskObject( officeWorld, workers[whichOne].getX(), getAssetManager().getImage("emptyImage"), camera, impTask); impTaskObjects.add(impTaskObject); // add to the list to keep track of it // spawn a "wake up" task object near them officeWorld.addEntity(impTaskObject); SoundPlayer.getSoundPlayer().playImpApproaching(); // System.out.println("An imp started to attack an employee: whichOne: " + whichOne // + ", worker being attacked already: " + workers[whichOne].isBeingAttackedByImp()); workers[whichOne].setBeingAttackedByImp(true); } } currImpAttackTime = 0; } if (nextTaskIndex < toDoList.size() && toDoList.get(nextTaskIndex).isComplete()) { nextTaskIndex++; } for (int j = 0; j < toDoList.size(); j++) { toDoList.get(j).update(delta); } // 3. ?? update the input ?? // Input does not need to be updated // Update the camera // The camera sets its position itself camera.setXLocation((int) (demonPlayer.getX() + (demonPlayer.getWidth() / 2) - 400)); // Cool parallax scrolling parallaxOffset = (int) ((float) (demonPlayer.getX() / ((float) (Camera.getCameraMax() - demonPlayer.getWidth()) - Camera.getCameraMin())) * 800); // Update flying imp if (showImp) { impXLoc += 30; if (impXLoc > 850) { showImp = false; } } // startShowingImp(); OfficeTaskObject intersects = null; for (int i = 0; i < officeWorld.getEntities().size(); i++) { OfficeObject obj = officeWorld.getEntities().get(i); if (obj instanceof OfficeTaskObject) { OfficeTaskObject task = (OfficeTaskObject) obj; if (task instanceof ChangeEmployeeStateTaskObject || task instanceof ImpAttackTaskObject) { // if a wake employee, interview, or kill imp task is completed, then its deleted on // completion. if (task.getAssociatedTask().isComplete()) { // remove object if (activeTask == task.getAssociatedTask()) { activeTask = null; } obj.setParent(null); officeWorld.getEntities().remove(obj); // remove the imp task from the list of imp tasks. if (task instanceof ImpAttackTaskObject) { ImpAttackTaskObject iat = (ImpAttackTaskObject) task; if (impTaskObjects.contains(iat)) { impTaskObjects.remove(iat); } } continue; // go to the next iteration. } } if (task.collidesWith(demonPlayer)) { intersects = task; } } } if (intersects != null) { activeTask = intersects.getAssociatedTask(); } else { activeTask = null; } gui.update(-1, -1); }