// Handler.cpp : Handler class // // 17.11.1998 / DH - Genesis // // Copyright (c) 1998 Daniel Hartmeier. All rights reserved. #include "Handler.hpp" #include "Pad.hpp" #include // ------------------------------------------------------------------- extern "C++" void load(char *filename, unsigned char *address); // ------------------------------------------------------------------- #define ADR_TIM_FONT (unsigned char*)0x80090000 #define ADR_TIM_SPRITES (unsigned char*)0x80091F00 #define ADR_TIM_TILES (unsigned char*)0x800A2200 #define ADR_TIM_TITLE (unsigned char*)0x800B2500 #define ADR_SOUND_VH (unsigned char*)0x800DA600 #define ADR_SOUND_VB (unsigned char*)0x800DE600 #define ADR_LEVEL_1 (unsigned char*)0x800FE600 #define ADR_LEVEL_2 (unsigned char*)0x800FF600 // ------------------------------------------------------------------- Image *imageFont = 0; // Font Image *imageSprites = 0; // Hero, Enemies, Shots, Explosion Image *imageTiles = 0; // Tiles Image *imageTitle = 0; // Title Sound *sound = 0; // Sound Hero *hero = 0; // Hero // ------------------------------------------------------------------- Handler::~Handler() { for (Level *level = levels.First(); level; level = levels.Remove()) delete level; if (hero) delete hero; } // ------------------------------------------------------------------- RickHandler::RickHandler() : Handler() { // Use these calls when running from CD, otherwise disable //load("\\FONT.TIM;1", ADR_TIM_FONT); //load("\\SPRITES.TIM;1", ADR_TIM_SPRITES); //load("\\TILES.TIM;1", ADR_TIM_TILES); //load("\\TITLE.TIM;1", ADR_TIM_TITLE); //load("\\SOUND.VH;1", ADR_SOUND_VH); //load("\\SOUND.VB;1", ADR_SOUND_VB); sound = new Sound(ADR_SOUND_VH, ADR_SOUND_VB); imageFont = new Image(ADR_TIM_FONT); imageSprites = new Image(ADR_TIM_SPRITES); imageTiles = new Image(ADR_TIM_TILES); imageTitle = new Image(ADR_TIM_TITLE); font = new Font(imageFont, 10, 16, (unsigned char*)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,.-;:+!?()/*\"@©~"); hero = new Hero(*this); textwindow = new TextWindow(); textwindow->setFont(font); menuwindow = new MenuWindow(); menuwindow->setFont(font); mode = mTitle; submode = 0; textwindow->text((unsigned char*)"\n\n\n\n\n\n\n\n\n\n\n\n\n"); } // ------------------------------------------------------------------- RickHandler::~RickHandler() { delete menuwindow; delete textwindow; delete hero; delete font; delete imageTitle; delete imageTiles; delete imageSprites; delete imageFont; delete sound; } // ------------------------------------------------------------------- bool RickHandler::act(unsigned long pad) { bool terminate = false; if (mode == mTitle) actTitle(pad); else if (mode == mMenu) actMenu(pad); else if (mode == mBeginLevel) actBeginLevel(pad); else if (mode == mPlaying) actPlaying(pad); else if (mode == mEndLevel) actEndLevel(pad); else if (mode == mGameOver) actGameOver(pad); else if (mode == mCredits) actCredits(pad); else if (mode == mOptions) actOptions(pad); else if (mode == mQuit) terminate = true; return terminate; } void RickHandler::actTitle(unsigned long pad) { mode = mMenu; submode = 0; return; } void RickHandler::actMenu(unsigned long pad) { if (submode == 0) { menuwindow->setColor(64, 64, 192); menuwindow->move(200, 200, 100, 48); menuwindow->text((unsigned char*)"Start game\nCredits\nQuit"); menuwindow->show(); submode++; } else if (submode == 1) { if (!(pad & padX)) { submode++; } } else if (submode == 2) { int selection = menuwindow->act(pad); if (selection == 1) { submode++; } else if (selection == 2) { mode = mCredits; submode = 0; } else if (selection == 3) { mode = mQuit; submode = 0; } } else if (submode == 3) { menuwindow->hide(); menuwindow->clear(); levels.Append(new Level2(*this, *hero, imageTiles, ADR_LEVEL_1)); levels.Append(new Level1(*this, *hero, imageTiles, ADR_LEVEL_2)); level = levels.First(); mode = mBeginLevel; submode = 0; } return; } void RickHandler::actBeginLevel(unsigned long pad) { if (submode == 0) { level->reset(); hero->reset(); level->act(0); textwindow->setColor(48, 16, 64); textwindow->move(105, 96, 110, 48); unsigned char t[64]; sprintf((char*)t, "\n LEVEL %d", levelNo); textwindow->text(t); textwindow->show(); submode++; } else if (submode < 50) { submode++; } else if (submode == 50) { textwindow->hide(); textwindow->clear(); mode = mPlaying; submode = 0; } return; } void RickHandler::actPlaying(unsigned long pad) { if (submode == 0) { if ((pad & padSelect) && (pad & padStart)) { for (Level *level = levels.First(); level; level = levels.Remove()) delete level; levelNo = 1; mode = mTitle; submode = 0; } else if (pad & padSelect) heroDeath(); else level->act(pad); } return; } void RickHandler::actEndLevel(unsigned long pad) { if (submode == 0) { textwindow->setColor(48, 16, 64); textwindow->move(60, 96, 200, 64); textwindow->text((unsigned char*)"\n * Level complete *\n Congratulations!"); textwindow->show(); submode++; } else if (submode < 100) { submode++; } else if (submode == 100) { textwindow->hide(); textwindow->clear(); delete level; level = levels.Remove(); if (level) { levelNo++; mode = mBeginLevel; submode = 0; } else { levelNo = 1; mode = mTitle; submode = 0; } } return; } void RickHandler::actGameOver(unsigned long pad) { return; } void RickHandler::actCredits(unsigned long pad) { if (submode == 0) { //textwindow->setColor(32, 32, 96); textwindow->setColor(0, 0, 0); textwindow->move(10, 10, 300, 236); textwindow->text((unsigned char*)"\n Rick Rangerous\nA basic 2D jump-and-run game\n Early beta release\n\n Copyright © 1998 by\n\n Daniel Hartmeier\n Mischelistrasse 4\n 4153 Reinach\n Switzerland\n daniel@reichardt.ch\n\n All rights reserved."); textwindow->show(); submode++; } else if (submode == 1) { if (!pad) { submode++; } } else if (submode == 2) { if (pad & padX) { sound->play(SOUND_CLICK2); submode++; } } else if (submode == 3) { textwindow->hide(); textwindow->clear(); mode = mMenu; submode = 0; } return; } void RickHandler::actOptions(unsigned long pad) { return; } void RickHandler::heroDeath() { sound->play(SOUND_FALLBONK); mode = mBeginLevel; submode = 0; return; } void RickHandler::levelComplete() { mode = mEndLevel; submode = 0; return; } // ------------------------------------------------------------------- void RickHandler::clear(GsOT *ot) { // if (mode == mMenu) if ((mode == mMenu) || (mode == mCredits)) imageTitle->moveImage(0, 0); else if ((mode == mBeginLevel) || (mode == mPlaying) || (mode == mEndLevel)) // else if (mode == mPlaying) { int r = 20, g = 30, b = 170; level->getWeather().getBackgroundColor(r, g, b); GsSortClear(r, g, b, ot); } else if (mode == mCredits) GsSortClear(/*60, 16, 16*/0, 0, 0, ot); else GsSortClear(0, 0, 128, ot); return; } // ------------------------------------------------------------------- void RickHandler::draw(GsOT *ot) { if (mode == mTitle) { textwindow->draw(ot); } else if (mode == mMenu) { menuwindow->draw(ot); } else if (mode == mBeginLevel) { textwindow->draw(ot); level->draw(ot); } else if (mode == mPlaying) { textwindow->draw(ot); level->draw(ot); } else if (mode == mEndLevel) { textwindow->draw(ot); level->draw(ot); } else if (mode == mGameOver) { textwindow->draw(ot); } else if (mode == mCredits) { textwindow->draw(ot); } else if (mode == mOptions) { textwindow->draw(ot); } return; } // -------------------------------------------------------------------