;12.29.1999 INCLUDE "Source/defs.inc" INCLUDE "Source/levels.inc" ;world map ;miscellaneous areas SECTION "SysVariables",WRAM0[$c000] backBuffer:: DS 608 ;32x19; automatically copied to VRAM every vblank ;NOTE: addr must start on multiple of 16 ;NOTE: attribute buffer starts 160 bytes later ;at $c300 ;0 - $c260 - map attributes & calculation helpers mapOffsetNorth:: DS 2 ;this memory location + 6 must not mapOffsetEast:: DS 2 ;have carry mapOffsetSouth:: DS 2 mapOffsetWest:: DS 2 ;8 mapWidth:: DS 1 ;8 $c268 mapPitch:: DS 1 ;9 $c269 mapPitchMinusOne:: DS 1 ;10 $c26a mapPitchMinusOneComplement :: DS 1 ;11 $c26b mapSkip:: DS 1 ;difference between width and pitch mapHeight:: DS 1 ;13 $c26d mapColor: DS 2 ;14 $c26e firstHero:: DS 1 ;16 $c270 class index of first hero numBGTiles: DS 1 ;17 $c271 bgDestPtr: DS 2 ;18 $c272 numFGTiles:: DS 1 ;20 $c274 numFGTiles_save: DS 1 ;addr by offset in SaveFGTileInfo numClasses:: DS 1 ;22 $ c276 numClasses_save: DS 1 ; $c277 fgDestPtr:: DS 2 ;ref by offset in SaveFGTileInfo fgDestPtr_save: DS 2 ;for use in SaveFGTileInfo loadTileL: DS 1 ; $c27c loadTileH: DS 1 ; $c27d ;30 mapLeft:: DS 1 ; $c27e mapRight:: DS 1 ; $c27f mapRightPlusOne:: DS 1 ; $c280 mapTop:: DS 1 ; $c281 mapBottom:: DS 1 ; $c282 mapBottomPlusOne:: DS 1 ; $c283 mapMaxLeft:: DS 1 ; $c284 mapMaxTop:: DS 1 ; $c285 camera_i:: DS 1 ; $c286 camera_j:: DS 1 ; $c287 distToWall_N:: DS 1 ; $c288 distToWall_E:: DS 1 ; $c289 distToWall_S:: DS 1 ; $c28a distToWall_W:: DS 1 ; $c28b ;44 mapTotalSize:: DS 2 ;location 1 beyond end, e.g. $dc00 ($c28c) mapExitLinks:: DS 16 ; $c28e desiredMapLeft:: DS 1 ; $c29e desiredMapTop:: DS 1 ; $c29f curPixelOffset_x:: DS 1 ; $c2a0 curPixelOffset_y:: DS 1 ; $c2a1 desiredPixelOffset_x:: DS 1 ; $c2a2 desiredPixelOffset_y:: DS 1 ; $c2a3 scrollAccelState_x:: DS 1 ; $c2a4 scrollAccelState_y:: DS 1 ; $c2a5 mapBank:: DS 2 ; $c2a6 mapContents:: DS 2 ; $c2a8 dialogBank:: DS 1 ; $c2aa xlink curTrackStackL:: DS 1 ; $c2ab for music ;----routine parameters---------------------------------------------- ;74 methodParamL:: DS 1 ; $c2ac methodParamH:: DS 1 ; $c2ad bulletDirection:: DS 1 ; $c2ae bulletLocation:: DS 2 ; $c2af bulletColor:: DS 1 ; $c2b1 tempL:: DS 1 ; $c2b2 tempH:: DS 1 ; $c2b3 delTempL:: DS 1 ; $c2b4 delTempH:: DS 1 ; $c2b5 ;84 moveAlignPrecision:: DS 1 ; $c2b6 fireBulletDirection:: DS 1 ; $c2b7 bulletDamage:: fireBulletDamage:: DS 1 ; $c2b8 fireBulletSound:: DS 2 ; $c2b9 fireBulletLocation:: DS 2 ; $c2bb explosionInitialFrame:: DS 1 ; $c2bd myGroup:: DS 1 ; $c2be myFacing:: DS 1 ; $c2bf secondChoiceDirection:: DS 1 ; $c2c0 ;95 fadeSteps:: DS 1 ; $c2c1 fadeStepsToGo:: DS 1 ; $c2c2 dmaLoadSrc0:: DS 2 ; $c2c3 dmaLoadDest0:: DS 2 ; $c2c5 dmaLoadLen0:: DS 1 ; $c2c7 dmaLoadSrc1:: DS 2 ; $c2c8 dmaLoadDest1:: DS 2 ; $c2ca dmaLoadLen1:: DS 1 ; $c2cc ;97 metaSprite_y:: DS 1 ; $c2cd metaSprite_x:: DS 1 ; $c2ce metaSprite_first_x:: DS 1 ; $c2cf bgFlags:: DS 1 ;set in some methods to look at later ;$c2d0 ;----environment info and control------------------------------------ ;101 mapDialogClassIndex:: DS 10 ;$c2d1 mapHeroZone:: DS 1 ;$c2db specialFX:: DS 1 ;$c2dc displayType:: DS 1 ;0 for map, 1 for cinema $c2dd scrollSprites:: DS 1 ;$c2de heroesIdle:: DS 1 ;1=idle, 0=active ;$c2df ;----class stuff----------------------------------------------------- ;116 oldZone:: DS 1 ;$c2e0 firstFreeObj:: DS 1 ;index of first free node $c2e1 curObjIndex:: DS 1 ;$c2e2 iterateNext:: DS 2 ;$c2e3 oamFindPos:: DS 1 ;$c2e5 numFreeSprites:: DS 1 ;$c2e6 nextObjIndex:: DS 1 ;$c2e7 levelCheckStackPos:: DS 2 ;$c2e8 ;126 objTimerBase:: DS 1 ;$c2ea objTimer60ths:: DS 1 ;$c2eb heroTimerBase:: DS 1 ;$c2ec heroTimer60ths:: DS 1 ;$c2ed ;130 baMoved:: DS 1 ;used in BA check $c2ee bsMoved:: DS 1 ;used in BS check $c2ef ;--set above to zero in LinkRemakeList heroJoyIndex:: DS 1 ;bits 5:0 grenade, lady, captain, ;haiku, bs, ba $c2f0 myJoy:: DS 1 ;$c2f1 curInput0:: DS 1 ;$c2f2 curInput1:: DS 1 ;$c2f3 dialogJoyIndex:: DS 1 ;0 or 1 $c2f4 getLocInitFacing:: DS 1 ;$c2f5 losLimit:: DS 1 ;tiles to scan (0=infinite or 1) $c2f6 dialogSpeakerIndex:: DS 1 ;in ChooseFromDialogAlterates $c2f7 levelCheckSkip:: DS 4 ;$c2f8 jiggleLoc:: DS 1 ;random pos for async jiggle $c2fc dialogSettings:: DS 1 ;[:0] show border, [:1] show continue ;[:2] wait release (see defs.h DLG_*) fadeRange:: DS 1 ;defaults to 64 (all colors) but ;can be set to 32 (or the like) for ;BG fades only (is reset to 64 after) guardAlarm:: DS 1 ;guard sounded the alarm? ;next pos: $c2fe ;160/160 blankSpace: PRINTT "blank space 1: " PRINTV (768 - (blankSpace - backBuffer)) PRINTT "\n" DS (768 - (blankSpace - backBuffer)) attributeBuffer:: DS 608 ;see notes on backBuffer above ;game state variables $c560 gameState:: heroesAvailable:: DS 2 ;$c560 heroesUsed:: DS 1 ;$c562 heroesLocked:: DS 1 ;$c563 appomattoxMapIndex:: DS 1 ;$c564 respawnMap:: DS 2 ;$c565 ;map to go to after dying joinMap:: DS 2 ;$c567 ;map to join for 2nd player ;pad allIdle:: DS 1 ;$c569 ;no one allowed to move dialogIdleSettings:: DS 1 ;$c56a canJoinMap:: DS 1 ;$c56b checkTemp:: DS 1 ;$c56c amLinkMaster:: DS 1 ;$ff=no link/slave, $fe=no link/master ;1=link/master, 0=link/slave $c56d lastLinkAction:: DS 1 ;$00=receive, $01=transmit $c56e checkInputInMainLoop:: DS 1 ;$c56f amShowingDialog:: DS 1 ;$c570 amSynchronizing: DS 1 ;$c571 longCallTempA:: DS 1 ;$c572 amChangingMap:: DS 1 ;$c573 curHeroAddressL:: DS 1 ;LCByte of hero address $c574 heroesPresent:: DS 1 ;%000000ba, b=hero1, a=hero0 $c575 curLevelIndex:: DS 2 ;in BCD $c576 curLevelStateIndex:: DS 1 ;0-255 $c578 timeToChangeLevel:: DS 1 ;$c579 musicOverride1:: DS 1 ;$c57a musicOverride4:: DS 1 ;$c57b linkBailOut:: DS 4 ;$c57c fadeCurPalette:: DS 128 ;$c580 ;128 bgTileMap:: DS 256 ;$c600 bgAttributes:: DS 256 ;$c700 ;$c800-$c81f hero data hero0_data:: curJoy0:: DS 1 ;NOTE: MSByte of address should not hero0_index:: DS 1 ;change between here and the end of hero0_object:: DS 2 ;the hero stuff hero0_bullet_index:: DS 1 hero0_class:: DS 2 hero0_enterLevelFacing:: DS 1 ;misnomer, actually exit direction hero0_enterLevelLocation:: DS 2 hero0_i:: DS 1 hero0_j:: DS 1 hero0_type:: DS 1 ;HERO_BA_FLAG etc hero0_health:: DS 1 hero0_moved:: DS 1 hero0_puffCount:: DS 1 ;NOTE change HERODATASIZE if adding more than 16 vars here ;$c810 hero1_data:: curJoy1:: DS 1 hero1_index:: DS 1 hero1_object:: DS 2 hero1_bullet_index:: DS 1 ;See NOTE above hero1_class:: DS 2 ;e.g. 1030 = BA hero1_enterLevelFacing:: DS 1 ;misnomer, actually exit direction hero1_enterLevelLocation:: DS 2 hero1_i:: DS 1 hero1_j:: DS 1 hero1_type:: DS 1 ;HERO_BA_FLAG etc hero1_health:: DS 1 hero1_moved:: DS 1 hero1_puffCount:: DS 1 ;NOTE change HERODATASIZE if adding more than 16 vars here ;$c820 variables for level check in RAM levelVars:: DS 64 ;$c860 music vars musicBank:: DS 1 ;c860 musicNoteCountdownInit:: DS 1 ;c861 musicNoteCountdown:: DS 1 ;c862 musicTrack1Pos:: DS 2 ;c863 musicTrack2Pos:: DS 2 ;c865 musicTrack3Pos:: DS 2 ;c867 musicTrack4Pos:: DS 2 ;c869 musicInstrument1:: DS 5 ;c86b musicInstrument2:: DS 4 ;c870 musicInstrument3:: DS 4 ;c874 musicInstrument4:: DS 4 ;c878 musicWaveform:: DS 16 ;c87c musicStackL1:: DS 1 ;c88c musicStackL2:: DS 1 ;c88d musicStackL3:: DS 1 ;c88e musicStackL4:: DS 1 ;c88f musicRegisters:: DS 16 ;c890 r[15] = flags, :0 = z numFreeObjects:: DS 1 ;$c8a0 fgFlags:: DS 1 ;$c8a1 temp variable, set in GetFGAttributes lineZeroHorizontalOffset:: DS 1 ;$c8a2 musicAddress:: DS 2 ;$c8a3-c8a4 hblankVector:: DS 3 ;c8a5-c8a7 exitTileIndex:: DS 1 ;c8a8 bulletClassIndex:: DS 1 ;c8a9 inventory: DS 16 ;c8aa-c8b9 dialogNPC_speakerIndex:: DS 1 ;c8ba who's talking dialogNPC_heroIndex:: DS 1 ;c8bb hero being talked to dialogBalloonClassIndex:: DS 1 ;c8bc class that has dialog balloons envEffectType:: DS 1 ;c8bd type of env effect in use bsUpgrades:: DS 1 ;c8be baUpgrades:: DS 1 ;c8bf haikuUpgrades:: DS 1 ;c8c0 iterateNumObjects:: DS 1 ;c8c1 try to keep frame rate at 30fps (UNUSED, screws synch) standardFadeColor:: DS 1 ;c8c2 inLoadMethod:: DS 1 ;c8c3 loadStackPosL:: DS 1 ;c8c4 loadStackPosH:: DS 1 ;c8c5 ;$c8c2 - $c8ff free space SECTION "LevelCheckMethodSection",WRAM0[$c900] levelCheckRAM:: DS $500 ;1.25 k of data SECTION "SpriteMemory",WRAM0[$ce00] spriteOAMBuffer:: DS $A0 ;must start on even $100 ;In the following definitions note that some of the labels that are defined ;as the same address will be used to store values in different ;memory banks SECTION "MapAndObjVars",WRAMX[$d000] map:: objects:: headTable:: tileShadowBuffer:: attributeShadowBuffer:: zoneBuffer:: wayPointList:: DS 256 ;bank 1, first 256 bytes of map ;bank 2, start of 256 bytes of linked list head indices ;bank 3, start of 4k of object storage ;bank 4, start of 4k of tile shadow buffer ;bank 5, start of 4k of attribute shadow buffer ;bank 6, start of 4k of zone info ;bank 7, start of 512 byte wayPointList tailTable:: DS 256 ;bank 1, bytes 256-512 of map ;bank 2, indices of objects at tail of list ;bank 3, bytes 256-512 of object storage ;bank 7, wayPointList continued pathList:: rainbowColors:: ;$d200 DS 256 ;bank 1, bytes 512-1024 of map (512 bytes) ;bank 2, free ;bank 3, bytes 512-1024 of object storage (512 bytes) ;bank 7, start of 1024-byte pathList (512 bytes) horizontalOffset:: DS 144 ;bank 1, bytes 768-1024 of map (256) ;bank 2, horizontal scroll position for each line (144) ;bank 3, bytes 768-1024 of object storage (256) ;bank 7, pathList continued (256) DS 112 ;bank 2, free objExists:: ;$d400 DS 256 ;bank 1, bytes 1024-1535 of map ;bank 2, 256 bytes validity of object index n ;bank 3, bytes 1024-1535 of object storage ;bank 7, pathList continued FOFTable:: ;$d500 DS 256 ;bank 1, bytes 1024-1279 of map ;bank 2, Group FOF table ;bank 3, bytes 1024-1279 of object storage ;bank 7, pathList continued pathMatrix:: ;$d600 DS 256 ;bank 1, bytes 1536-1791 of map ;bank 2, free ;bank 3, bytes 1536-1791 of object storage ;bank 7, 256 byte pathMatrix[16][16] levelState:: fgTileMap:: ;bank 1, bytes 1792-2047 of map ;$d700 DS 256 ;bank 2, index of first tile for each class ;bank 3, bytes 1792-2047 of object storage ;bank 7, 256 byte map state save levelState[256] objClassLookup:: heroState:: ;UNUSED! ;$d800 DS 256 ;bank 1, bytes 2048-2303 of map ;bank 2, 256 byte lookup table for class type ;bank 3, bytes 2048-2303 of object storage ;bank 7, 256 byte heroState storage (16 bytes/hero) UNUSED! musicStack:: ;$d900 DS 256 ;bank 1, bytes 2304-2559 of map ;bank 2, unused ;bank 3, bytes 2304-2559 of object storage ;bank 7, 128 byte stack for music code associatedIndex:: flightCode:: ;$da00 DS 256 ;bank 1, bytes 2560-2815 of map ;bank 2, 256 byte table of associated class indices ;bank 3, bytes 2560-2815 of object storage ;bank 7, 1-byte count + 85 3-byte flight codes spritesUsed:: ;$db00 DS 128 ;bank 1, bytes 2816-3071 of map ;bank 2, 40-byte lookup (1=sprite used, 0=free) ;bank 3, bytes 2816-3071 of object storage fadeFinalPalette:: DS 128 ;bank 7, 128-byte fade final palette ;bgAttributes:: ;$dc00 DS 256 ;bank 2, free fgAttributes:: ;$dd00 DS 256 ;bank 2, tile attributes for FG tiles ;bank 1, bytes 3328-3583 of map ;bank 3, bytes 3328-3583 of object storage classLookup:: fadeDelta:: ;bank 1, bytes 3584-4095 of map ;$de00 DS 192 ;bank 2, 512 byte table for class info ;bank 3, bytes 3584-4095 of object storage ;bank 7, 192 bytes of fade info fadeError:: DS 192 ;bank 7, 192 bytes of fade info gamePalette:: ;$df80 DS 128 ;bank 7, 128 bytes of "true" game palette SECTION "MapLoader",ROM0 ;--------------------------------------------------------------------- ; Routine: LoadMap ; Arguments: hl - index of map xxyy 0000 - 1515 in BCD ; Alters: af ; Description: Loads specified map ;--------------------------------------------------------------------- LoadMap:: push bc push de push hl push hl ;clear out zone & exit memory ld a,ZONEBANK ld [$ff70],a ld hl,$d000 xor a ld [displayType],a ld c,0 ;256 .clr1_o ld b,16 ;*16 .clr1_i ld [hl+],a dec b jr nz,.clr1_i dec c jr nz,.clr1_o pop hl call MapCoordsToIndex ld l,a ld h,0 ;load in the level state for this level ld a,l ld [curLevelStateIndex],a ld a,LEVELSTATEBANK ld [$ff70],a push hl ld h,((levelState>>8) & $ff) ld a,[hl] ldio [mapState],a xor a ldio [mapState+1],a pop hl ;multiply map index by 4 to find offset into address lookup sla l ;shift <<= 2 rl h sla l rl h ld de,MapLookupTable add hl,de ld a,BANK(MapLookupTable) call SetActiveROM ld de,mapBank ;start of 4 bytes of info storage ld c,4 .loop ld a,[hl+] ld [de],a inc de dec c jr nz,.loop xor a ld [amSynchronizing],a ld [hero0_index],a ld [hero1_index],a ld [heroJoyIndex],a ;set up one hero for now, hero 0 if we're master and hero 1 ;if we're slave. ld a,[amLinkMaster] or a jr z,.setMyHeroAs1 ld a,1 ld [hero0_index],a ld a,[hero0_type] ;note joy index remains zero if we're master jr .afterSetMyHero .setMyHeroAs1 ld hl,heroJoyIndex ld a,1 ld [hero1_index],a ld a,[hero1_type] or [hl] ld [hl],a .afterSetMyHero ;Check if we're linked up to another game ld a,[amLinkMaster] bit 7,a jr z,.amLinked jp .afterLinkCheck .amLinked ;am linked up. See if I'm trying to join the same map ;as is already playing on the remote machine. .checkSameMap ld a,LGETMAPINDEX call ExchangeByte cp LGETMAPINDEX jr z,.linkMachineChangingMapAlso call CheckSimultaneousLCC jr nz,.checkSameMap ;must repeat jr .compareMapIndex .linkMachineChangingMapAlso ;Proceed if I'm the Link Master, wait and try again ;if I'm the slave. ld a,[amLinkMaster] or a jr z,.checkSameMapTryAgain ;call KillWaitScreen jp .afterLinkCheck .checkSameMapTryAgain call ShowWaitScreen ;kill some time to allow host to do its thing ld c,10 .checkSameMapDelay ld a,LNULL call ExchangeByte call HandleRemoteInput dec c jr nz,.checkSameMapDelay jr .checkSameMap .compareMapIndex call ReceiveByte ;next byte will be the map index cp $ff ;wait code? jr z,.checkSameMapTryAgain ld b,a ;call KillWaitScreen ld a,[curLevelStateIndex] cp b jr z,.isSameMap jp .afterLinkCheck ;not the same map .isSameMap ;same map; go ahead and synchronize to it .requestSynchronize ld a,LSYNCHRONIZE call ExchangeByte call CheckSimultaneousLCC jr nz,.requestSynchronize call ReceiveByte ;get the response cp LSYNCHREADY jr z,.readyToSynchronize ;Not ready. Send a few null control codes to allow the other ;machine to continue game-play and then try again. call ShowWaitScreen .nullDelay_init ld c,10 .nullDelay ld a,LNULL call ExchangeByte call HandleRemoteInput dec c jr nz,.nullDelay ;jr .requestSynchronize jr .checkSameMap .readyToSynchronize ld hl,BailOutAddress xor a call SetLinkBailOutAddress call KillWaitScreen ;send my desired entry direction so host can evaluate if there's ;a free spot ld a,1 ;just a precaution for slave, host MUST do this ldio [curObjWidthHeight],a LDHL_CURHERODATA HERODATA_ENTERDIR ld a,[hl] call TransmitByte call ReceiveByte ;go/nogo signal from host or a jr nz,.goSignal ;nogo jr .nullDelay_init .goSignal call ReceiveByte ldio [mapState],a call ReceiveByte ldio [mapState+1],a call GuestExchangeHeroData ld hl,heroJoyIndex ld a,[hero1_type] or [hl] ld [hl],a ld a,1 ld [amSynchronizing],a .afterLinkCheck call KillWaitScreen ;Let the map figure out how to load itself. Typically ;will be just a call to ParseMap, but it could be different ;to do some cinematic stuff call ClearBackBuffer ld a,LVLOFFSET_LOAD call CopyMapMethodToRAM ld a,OBJROM call SetActiveROM ld hl,sp ld a,l ld [loadStackPosL],a ld a,h ld [loadStackPosH],a ld a,1 ld [inLoadMethod],a call levelCheckRAM AfterLoadLevelMethod:: xor a ld [inLoadMethod],a ld a,[timeToChangeLevel] or a jr z,.stillOkay ;need to redo (perhaps cinematic) ;save the map state back where it came from ;if zero set to one to indicate we've been here ld a,LEVELSTATEBANK ld [$ff70],a ld a,[curLevelStateIndex] ld l,a ld h,((levelState>>8) & $ff) ldio a,[mapState] or a jr nz,.stateNotZero ld a,1 .stateNotZero ld [hl],a jr .done .stillOkay ld a,OBJROM call SetActiveROM call AddObjectsToObjList call InitFOF ;Add the heroes to the map. Add Host's hero first. ld a,[amSynchronizing] or a jr z,.addZeroThenOne ld a,[amLinkMaster] or a jr z,.addZeroThenOne ;add one then zero ld hl,hero0_index push hl ld hl,hero1_index jr .decidedHeroLoadOrder .addZeroThenOne ld hl,hero1_index push hl ld hl,hero0_index .decidedHeroLoadOrder call PrepSetupHero pop hl call PrepSetupHero call PrepareForInitialMapDraw ;adjust camera & calc offsets ld a,LVLOFFSET_INIT call CopyMapMethodToRAM ld a,OBJROM call SetActiveROM call levelCheckRAM call ClearBackBuffer ld a,LVLOFFSET_CHECK call CopyMapMethodToRAM ld a,OBJROM call SetActiveROM ;----continue synchronizing if warranted---------------------- ld a,[amSynchronizing] or a jr z,.afterSynchronization .continueSynchronization LONGCALLNOARGS GuestContinueSynchronization .afterSynchronization xor a ld [amSynchronizing],a ;turn LCD on and stuff ld a,%11000011 ld [$ff40], a ;lcdc control .done LoadMapDone: pop hl pop de pop bc ret BailOutAddress: ld hl,0 xor a call SetLinkBailOutAddress ld a,1 ld [timeToChangeLevel],a jr LoadMapDone ShowWaitScreen: ld a,[displayType] ;shown the "waiting" screen yet or a ret nz ;load the "Waiting To Join" screen ld a,BANK(waitingToJoin_bg) ld hl,waitingToJoin_bg call LoadCinemaBG ld a,1 call Delay ld a,15 call SetupFadeFromStandard call WaitFade ret KillWaitScreen: ;was I showing the "waiting to join" screen? ld a,[displayType] or a ret z push bc push de push hl ld a,15 call SetupFadeToStandard call WaitFade ;call DisplayOff xor a ld [displayType],a pop hl pop de pop bc ret .afterRemoveWaitScreen .addHeroToMap PrepSetupHero:: ld a,[hl+] ;get hero index or a ret z ;hero not present ld a,l ;get hero number 0 or 1 IF HERODATASIZE!=16 jr fix this ENDC and 16 swap a ld d,a ;d is 0 or 1 inc hl ;skip object L,H inc hl inc hl ;skip bullet_index ld a,[hl+] ;bc = heroClass ld c,a ld a,[hl+] ld b,a ld a,[hl+] ;enter level direction push af ld a,[hl+] ;hl = entry location in XY ld h,[hl] ld l,a pop af ;retrieve entry direction call SetupHero ret PrepSetupHeroBC:: ld h,b ld l,c jr PrepSetupHero ;ret will return to my caller GuestExchangeHeroData: ;get the host's hero data ld a,[amLinkMaster] or a jr z,.recvHero0_sendHero1 ;slave exchange .recvHero1_sendHero0 ;master exchange ;turn on hero 1 ld a,1 ld [hero1_index],a ;set hero 1 joy index ld hl,hero0_data ;send this second push hl ld hl,hero1_data ;recv this first jr .afterExchangeHeroData .recvHero0_sendHero1 ;turn on hero 0 ld a,1 ld [hero0_index],a ld hl,hero1_data push hl ld hl,hero0_data ;recv dest .afterExchangeHeroData ld bc,HERODATASIZE xor a call ReceiveData ;send my hero data pop hl ld bc,HERODATASIZE xor a call TransmitData ret ;--------------------------------------------------------------------- ; Routine: MapCoordsToIndex ; Arguments: hl - map number in bcd (e.g. 0205) ; Returns: a - converted number (e.g. 82) ; Alters: af ; Description: Returns FromBCD(L) * 16 + FromBCD(H) ;--------------------------------------------------------------------- MapCoordsToIndex:: push hl ;Change bytes hl from BCD to normal ld a,h call BCDToNumber ld h,a ld a,l call BCDToNumber ld l,a ;a = l*16 + h (h & l must be 0-15 for this code) ld a,l swap a add h pop hl ret ;--------------------------------------------------------------------- ; Routine: BCDToNumber ; Arguments: a - a number in BCD (e.g. hex $19 = dec 19) ; Returns: a - converted number ; Alters: af ;--------------------------------------------------------------------- BCDToNumber: push bc push hl ;convert back to normal with: ; a = a[7:4] * 10 + a[3:0] ld b,a ;save A swap a and %00001111 ld hl,.lookupTimes10 add l ld l,a ld a,0 adc h ld h,a ld a,[hl] ;Upper nibble times 10 ld c,a ld a,b and %00001111 add c pop hl pop bc ret .lookupTimes10 DB 0,10,20,30,40,50,60,70,80,90 ;--------------------------------------------------------------------- ; Routine: NumberToBCD ; Arguments: a - a number (e.g. 19) ; Returns: a - converted number (e.g. $19) ; Alters: af ;--------------------------------------------------------------------- NumberToBCD:: ;a[7:4] = num / 10, a[3:0] = num % 10; push bc ld b,0 .divide10 cp 10 jr c,.dividedOut10 inc b sub 10 jr .divide10 .dividedOut10 swap b or b pop bc ret ;--------------------------------------------------------------------- ; Routine: LookupInMapContents ; Arguments: a - offset in contents table to look up ; [mapContents] must have been initialized ; Returns: hl - address stored at requested offset ; Alters: af, hl ; Description: Adds the offset to the start of the MapContents and ; returns the 16-bit value stored there ;--------------------------------------------------------------------- LookupInMapContents: push de ld d,0 ld e,a ld a,[mapBank] call SetActiveROM ld a,[mapContents] ld l,a ld a,[mapContents+1] ld h,a add hl,de ld a,[hl+] ld h,[hl] ld l,a pop de ret ;--------------------------------------------------------------------- ; Routine: SetupMapVarsFromWidthPitchAndHeight ; Arguments: [mapWidth],[mapPitch],[mapHeight] ; Description: Sets up: ; mapMaxLeft ; mapPitchMinusOne ; mapPitchMinusOneComplement ; mapSkip ; mapMaxTop ;--------------------------------------------------------------------- SetupMapVarsFromWidthPitchAndHeight:: push bc ;Get level dimensions width, pitch, and height ld a,[mapWidth] ld c,a sub 21 ld [mapMaxLeft],a ld a,[mapPitch] push af dec a ld [mapPitchMinusOne],a cpl ld [mapPitchMinusOneComplement],a pop af sub c ld [mapSkip],a ;skip width calculated fr width & pitch ld a,[mapHeight] ld b,a ;height in b sub 19 ld [mapMaxTop],a pop bc ret ;--------------------------------------------------------------------- ; Routine: ParseMap ; Arguments: [mapBank]/[mapContents] ; Description: Loads a map ;--------------------------------------------------------------------- ParseMap:: ;set bank and ptr to map ld a,LVLOFFSET_MAP call LookupInMapContents ;point hl at map ld a,[hl+] ;get and discard version number ld a,[hl+] ;get # of classes ld [numClasses],a ;store # classes ;Clear/initialize memory locations ;set initial # of bg/fg tiles ld a,40 ;leave room for 2 sets of 4x4 hero ld [numFGTiles],a ;tiles (20*2) ld a,1 ld [numBGTiles],a ;Set up ptrs to bg tile pattern mem and fg tile pattern mem ld a,$80 ld [fgDestPtr],a ;fg ptr gets $9280 (low byte) ld a,$92 ;high byte ld [fgDestPtr+1],a ld a,$10 ld [bgDestPtr],a ;bg ptr gets $9010 (low byte) ld a,$90 ;high byte ld [bgDestPtr+1],a ;Get index # of first monster ld a,[hl+] ldio [firstMonster],a ;discard first monster class (2 bytes) ld a,[hl+] ld a,[hl+] ;Load in class lookup table ld a,[numClasses] ld c,a ;set counter at # of classes ld b,1 ;index currently loading ;ld de,classLookup+2 ;lookup table to store classes in .loop ld a,[hl+] ;load in low byte of class ld [loadTileL],a ld a,[hl+] ;repeat with high byte ld [loadTileH],a ;set classLookup[i] to point to addr of class methods call SetClassLookupEntryForTile ;determine whether we're loading a BG tile or a monster tile ldio a,[firstMonster] cp b ;is firstMonster <= cur index? push bc jr z,.isMonsterTile jr c,.isMonsterTile .isBackgroundTile ld c,0 ;set c=0 to indicate BG tile jr .nowLoadTile .isMonsterTile ld c,1 ;set c=1 to indicate FG tile .nowLoadTile call LoadTile ;make sure we're back to the map bank ld a,[mapBank] call SetActiveROM pop bc inc b ;next class ldio a,[firstMonster] ;just loaded last bg tile? cp b jr nz,.terminationTest ld a,[numBGTiles] ;already copied the remaining buffer? and 31 call nz,CopyBGWorkToVRAM ;not yet .terminationTest dec c ;one less to go jr nz,.loop ;current value of numClasses will be value of firstHero ld a,[numClasses] ld [firstHero],a ;final value of numClasses (past 2 heroes+bullets) add 4 ld [numClasses],a ;Get level dimensions width, pitch, and height ld a,[hl+] ;width ld [mapWidth],a ld a,[hl+] ;pitch ld [mapPitch],a ld a,[hl+] ;height ld [mapHeight],a ld b,a ;height in b call SetupMapVarsFromWidthPitchAndHeight ;Get width*height class indices ld a,MAPBANK ;switch to map RAM bank ld [$ff00+$70],a ld d,h ;Switch to using de for retrieval ld e,l ld hl,map ;and hl for storage .outer0 ld a,[mapWidth] ;width in c ld c,a ;Load a row into memory .inner0 ld a,[de] ;get a tile class index inc de ld [hl+],a ;store it in RAM dec c jr nz,.inner0 ;load excess with zero to make internal map power of two wide ld a,[mapSkip] or a jr z,.afterFillExtra ld c,a xor a .fillExtra ld [hl+],a dec c jr nz,.fillExtra .afterFillExtra dec b jr nz,.outer0 ;hl contains location 1 beyond end of map ld a,l ld [mapTotalSize],a ld a,h ld [mapTotalSize+1],a ;Load background color ld a,[de] ;bg color low byte inc de ld [mapColor],a ld l,a ld a,[de] ;bg color high byte inc de ld [mapColor+1],a ld h,a ld b,%10000000 push de ld d,h ld e,l call SetupCommonColor pop de call ParseWayPointStuff call ParseZones call ParseExits call SetBGSpecialFlags ld b,255 ld hl,classExplosion call SetClassLookupEntry ret ;--------------------------------------------------------------------- ; Routine: ClearBackBuffer ; Arguments: None. ; Returns: Nothing. ; Alters: af ; Description: Clears the backBuffer and attributeBuffer so that ; horizontal offsets don't show any garbage ;--------------------------------------------------------------------- ClearBackBuffer:: push bc push de push hl ld bc,608 ld d,0 ld hl,backBuffer xor a call MemSet ld bc,608 ld d,0 ld hl,attributeBuffer xor a call MemSet pop hl pop de pop bc ret ;--------------------------------------------------------------------- ; Routine: SetClassLookupEntryForTile ; Arguments: [loadTileL/H] - tile index being loaded ; b - index in classLookup to load into ; Alters: ; Description: ;--------------------------------------------------------------------- SetClassLookupEntryForTile: push bc push de push hl ld a,OBJLISTBANK ld [$ff70],a ;set de to point to classLookup[b] (times two) ld d,0 ld e,b sla e rl d ld hl,classLookup add hl,de ld d,h ld e,l ld a,[loadTileH] ld h,a ld a,[loadTileL] ld l,a sla l rl h ;hl *= 2 ld bc,classTable add hl,bc ld a,BANK(classTable) call SetActiveROM ld a,[hl+] ;low byte of addr of class methods ld [de],a inc de ld a,[hl+] ;high byte ld [de],a ld a,OBJROM call SetActiveROM ;inc de pop hl pop de pop bc ret ;--------------------------------------------------------------------- ; Routine: SetClassLookupEntry ; Arguments: b - index in classLookup to set ; hl - ptr to class ; Alters: ; Description: ;--------------------------------------------------------------------- SetClassLookupEntry: push bc push de ld a,OBJLISTBANK ld [$ff70],a ;set de to point to classLookup[b] (times two) push hl ld d,0 ld e,b sla e rl d ld hl,classLookup add hl,de ld d,h ld e,l pop hl ld a,l ;low byte of addr of class methods ld [de],a inc de ld a,h ;high byte ld [de],a pop de pop bc ret ;--------------------------------------------------------------------- ; Routine: ParseZones ; Arguments: hl - pointer to start of zone data ; Alters: all registers ; Description: loads in zone attributes (parallel buffer to map) ; Stored using 2:1 backed bytes and run-length encoding ;--------------------------------------------------------------------- ParseZones: ld a,ZONEBANK ;switch in RAM bank for zones ld [$ff00+$70],a ld hl,zoneBuffer ;dest call .getNextRLEData ;loop as usual ld a,[mapHeight] ;# of rows ld b,a .outer ld a,[mapWidth] ;# of columns ld c,a srl c ;divide by two ;save two bytes for each count .inner ld a,[loadTileL] ;what's our RLE count look like? or a jr nz,.continue push bc call .getNextRLEData pop bc .continue ld a,[tempH] ld [hl+],a ld a,[tempL] ld [hl+],a ld a,[loadTileL] ;decrement RLE count dec a ld [loadTileL],a ;jr nz,.continue ;push bc ;call .getNextRLEData ;pop bc ;.continue dec c jr nz,.inner ;reached the end of a row, advance destptr to next row push bc xor a ld b,a ld a,[mapSkip] ld c,a add hl,bc pop bc dec b jr nz,.outer ret .getNextRLEData ld a,[de] ;read in a run length inc de ld [loadTileL],a ;store remaining # of bytes ld a,[de] ;read in run data inc de ld b,a swap a and $f ;zone for first byte ld [tempH],a ld a,b and $f ld [tempL],a ;zone for second byte ret ;--------------------------------------------------------------------- ; Routine: ParseExits ; Arguments: hl - pointer to start of exit data ; Alters: all registers ; Description: loads in exit attributes (parallel buffer to map) ; Stored using 2:1 backed bytes and run-length encoding ;--------------------------------------------------------------------- ParseExits: ld a,ZONEBANK ;switch in RAM bank for zones ld [$ff00+$70],a ld hl,zoneBuffer ;dest call .getNextRLEData ;loop as usual ld a,[mapHeight] ;# of rows ld b,a .outer ld a,[mapWidth] ;# of columns ld c,a srl c ;divide by two ;save two bytes for each count .inner ld a,[loadTileL] ;what's our RLE count look like? or a jr nz,.continue push bc call .getNextRLEData pop bc .continue ld a,[tempH] or [hl] ld [hl+],a ;exit in 7:4, zone in 3:0 ld a,[tempL] or [hl] ld [hl+],a ld a,[loadTileL] ;decrement RLE count dec a ld [loadTileL],a dec c jr nz,.inner ;reached the end of a row, advance destptr to next row push bc xor a ld b,a ld a,[mapSkip] ld c,a add hl,bc pop bc dec b jr nz,.outer ;read in 16 bytes of map links ld c,16 ld hl,mapExitLinks .readLink ld a,[de] inc de ld [hl+],a dec c jr nz,.readLink ret .getNextRLEData ld a,[de] ;read in a run length inc de ld [loadTileL],a ;store remaining # of bytes ld a,[de] ;read in run data inc de ld b,a and $f0 ;exit for first byte (in 7:4) ld [tempH],a ld a,b swap a and $f0 ld [tempL],a ;exit for second byte ret ;--------------------------------------------------------------------- ; Routine: SetBGSpecialFlags ; Arguments: none ; Alters: af ; Description: Loops through the loaded map and for each background ; tile with a special flag (WalkOver, ShootOver) sets ; bit 7 of the exit/zone map. ;--------------------------------------------------------------------- SetBGSpecialFlags:: push bc push de push hl ;clear out bit 7 in zone bank ld a,ZONEBANK ldio [$ff70],a ld hl,$d000 ld a,$e0 .clearZone res 7,[hl] inc hl cp h jr nz,.clearZone ld hl,map ld de,bgAttributes ld a,[mapHeight] ld b,a .outer push bc ldio a,[firstMonster] ld b,a ld a,[mapPitch] ld c,a ld a,MAPBANK ld [$ff00+$70],a .inner ld a,[hl] ;get a tile or a jr z,.notSpecial cp b jr nc,.notSpecial ;might be a Special tile ld e,a ;look up its BG attributes ld a,TILEINDEXBANK ld [$ff00+$70],a ld a,[de] and BG_FLAG_SPECIAL jr z,.notSpecialResetRAMBank ;is Special type ld a,ZONEBANK ld [$ff00+$70],a set 7,[hl] .notSpecialResetRAMBank ld a,MAPBANK ld [$ff00+$70],a .notSpecial inc hl dec c jr nz,.inner pop bc dec b jr nz,.outer pop hl pop de pop bc ret ;--------------------------------------------------------------------- ; Routine: ResetMyBGSpecialFlags ; Arguments: hl - map location ; Alters: af ; Description: If this background tile has any special flags then ; bit 7 of the exit/zone map is set. ;--------------------------------------------------------------------- ResetMyBGSpecialFlags:: push bc push de ldio a,[firstMonster] ld b,a ld a,MAPBANK ldio [$ff70],a ld a,[hl] ;get a tile or a jr z,.notSpecial cp b jr c,.maybeSpecial .isMonster ;get tile under monster ld a,TILESHADOWBANK ld [$ff70],a or a jr z,.notSpecial .maybeSpecial ;might be a Special tile ld d,((bgAttributes>>8)&$ff) ld e,a ;look up its BG attributes ld a,TILEINDEXBANK ld [$ff70],a ld a,[de] and BG_FLAG_SPECIAL jr z,.notSpecial ;is Special type ld a,ZONEBANK ld [$ff00+$70],a set 7,[hl] jr .done .notSpecial ld a,ZONEBANK ld [$ff70],a res 7,[hl] .done pop de pop bc ret ;--------------------------------------------------------------------- ; Routine: ParseWayPointStuff ; Arguments: hl - pointer to start of stored way point stuff ; Alters: all registers ;--------------------------------------------------------------------- ParseWayPointStuff: ld a,WAYPOINTBANK ;switch in waypoint RAM bank ld [$ff00+$70],a ;zero out waypoint list push hl ld c,0 xor a ld hl,wayPointList .zeroWayPoints ld [hl+],a ld [hl+],a dec c jr nz,.zeroWayPoints pop hl ;512-byte wayPoint list (location*[256]) ld a,[de] ;number of waypoints inc de ld [wayPointList],a or a jr nz,.continue ret ;no waypoints, no nothing .continue ld c,a ;c is number of waypoints ld a,[de] ;pad, discard inc de ld hl,wayPointList+2 ;&wayPointList[1] .wpLoad ld a,[de] ;copy high/low byte of waypoint inc de ld [hl+],a ld a,[de] inc de ld [hl+],a dec c jr nz,.wpLoad ;load paths ld a,[de] ;num paths inc de ld [pathList],a or a jr z,.afterPaths ld c,a ld hl,pathList+4 ;&pathList[1][0] .pathLoad ld a,[de] ;each path has 4 waypoint indices inc de ld [hl+],a ld a,[de] inc de ld [hl+],a ld a,[de] inc de ld [hl+],a ld a,[de] inc de ld [hl+],a dec c jr nz,.pathLoad .afterPaths ;load pathMatrix[16][16] ld hl,pathMatrix ld b,16 .outer ld c,16 .inner ld a,[de] inc de ld [hl+],a dec c jr nz,.inner dec b jr nz,.outer ret ;--------------------------------------------------------------------- ; Routine: LoadTile ; Arguments: [loadTileL/H] - tile number ; b - index of class being loaded (0-255) ; c - 0=bg tile, 1=fg tile ; Description: Switches in the ROM bank containing the tile to be ; loaded, sets a ptr to the source address, and calls ; LoadBGTile or LoadFGTile appropriately ;--------------------------------------------------------------------- LoadTile: push af push bc push de push hl ;figure out which bank the tile is in ld a,[loadTileL] ld l,a ld a,[loadTileH] ld h,a cp $08 ;bg if tile # less than 2048 ($800)? jr c,.bgTileSet ;fg tile set ld a,BANK(FGTiles) ;Swap in the right bank call SetActiveROM ld de,FGTiles ld a,h sub $08 ;minus 2048 (fg tiles new bank) ld h,a jp .loadTile .bgTileSet cp $04 ;first or second bank? jr c,.bgSet1 .bgSet2 sub $04 ld h,a ld a,BANK(BGTiles1024) ld de,BGTiles1024 jr .gotBank .bgSet1 ld a,BANK(BGTiles) ;Swap in the right bank ld de,BGTiles .gotBank call SetActiveROM .loadTile ;Convert hl into a src address offset (hl<<=4) and add base addr de ld a,h sla l rla sla l rla sla l rla sla l rla ld h,a add hl,de ;BG or FG class? ld a,c or a jr nz,.fgTile .bgTile call LoadBGTile jr .done .fgTile call LoadFGTile .done pop hl pop de pop bc pop af ret ;--------------------------------------------------------------------- ; Routine: LoadBGTile ; Arguments: b - index of class being loaded ; hl - src ptr to tile ROM ; Note: [bgDestPtr] - assumed to point to destination in VRAM ; tile bank 0 ; [numBGTiles] - index of tile in tile bank 0 ; Description: Loads in a tile to tile bank 0 at the given address. ; bgTileMap[index] is set to numBGTiles-1 ;--------------------------------------------------------------------- LoadBGTile: push af push bc push de push hl ld a,TILEINDEXBANK ;select RAM bank of tile index maps ld [$ff70],a ld de,bgTileMap ;setup de with &bgTileMap[classIndex] ld e,b ;b is class index ;set the attributes byte for this BG tile PUSHROM ld a,BANK(bg_colorTable) call SetActiveROM push de push hl push de ld a,[loadTileL] ld e,a ld a,[loadTileH] ld d,a ld hl,bg_colorTable add hl,de pop de ld d,((bgAttributes>>8)&$ff) ld a,[hl] ld [de],a pop hl pop de POPROM ;Increment number of BG tiles counter ld a,[numBGTiles] ld [de],a ;cur tile index into bgTileMap[classIndex] inc a ld [numBGTiles],a ;Load in 16 bytes to the work buffer ($c000 + (bgDestPtr&511)) ;(32 * 16 = 511) ld a,[bgDestPtr] ld e,a ld a,[bgDestPtr+1] ld d,a push de and 1 add $c0 ld d,a ld c,16 .loop ld a,[hl+] ld [de],a inc de dec c jr nz,.loop pop de call AddDE16 ;copy the work buffer to VRAM if numBGTiles is a multiple of 32 ld a,[numBGTiles] and 31 call z,CopyBGWorkToVRAM IF 0 ;Load in 16 bytes ld a,0 ld [$ff00+$4f],a ;load into bank 0 ld a,[bgDestPtr] ;set de=destPtr ld e,a ld a,[bgDestPtr+1] ld d,a ld c,16 ;# of bytes to load .loop ld a,[hl+] ld [de],a inc de dec c jr nz,.loop ENDC ;store modified destptr ld a,e ld [bgDestPtr],a ld a,d cp $98 jr c,.checkedNegative sub $10 .checkedNegative ld [bgDestPtr+1],a .done pop hl pop de pop bc pop af ret CopyBGWorkToVRAM: push bc push de push hl ;set destptr to be bgDestPtr & (~511) ld e,0 ld a,[bgDestPtr+1] and $fe ld d,a ;if bgDestPtr is $9000 (1st tile) set $c000-$c00f to black ;for the blank tile ld a,e or a jr nz,.afterCopyBlank ld a,d cp $90 jr nz,.afterCopyBlank ld c,16 ld hl,$c000 xor a .setBlankLoop ld [hl+],a dec c jr nz,.setBlankLoop .afterCopyBlank ld a,[numBGTiles] dec a and 31 inc a ld c,a xor a ld hl,$c000 call VMemCopy pop hl pop de pop bc ret ;--------------------------------------------------------------------- ; Routine: LoadFGTile ; Arguments: b - index of class being loaded ; hl - src ptr to tile ROM ; Note: [fgDestPtr] - assumed to point to destination in VRAM ; tile bank 1 ; [numFGTiles] - index of tile in tile bank 1 ; Description: Loads in a tile to tile bank 0 at the given address. ; fgTileMap[index] is set to numFGTiles-1 ; Duplicates any tiles loaded into $9000-$9800 into ; $8000-$8800 for tile<->sprite conversion purposes ;--------------------------------------------------------------------- LoadFGTile: push af push bc push de push hl ld a,TILEINDEXBANK ;select RAM bank of tile index maps ld [$ff00+$70],a ld de,fgTileMap ;setup de with &fgTileMap[classIndex] ld e,b ;b is class index ;set the attributes byte for this FG tile push de push hl push de ld a,[loadTileL] ld e,a ld a,[loadTileH] and $03 ld d,a ld hl,fg_colorTable add hl,de pop de ld d,((fgAttributes>>8)&$ff) ld a,[hl] ld [de],a ld b,a ;save the attributes byte in b ldio [curObjWidthHeight],a pop hl pop de ;Place tile index in fgTileMap ld a,[numFGTiles] ld [de],a ;cur tile index into fgTileMap[classIndex] push af ;load in 2 tiles for a FG object ;b has bit 5 set for 2x2 or cleared for 1x1; ;manipulate b to have either 8 for 2x2 or 2 for 1x1. bit 5,b jr nz,.load8Tiles ld b,2 jr .setNumTilesToLoad .load8Tiles ld b,8 .setNumTilesToLoad ld de,$c000 ;load to work buffer .nextTile ;Increment number of FG tiles counter ld a,[numFGTiles] inc a ld [numFGTiles],a ;Load in 16 bytes ld c,16 .nextByte ld a,[hl+] ld [de],a inc de dec c jr nz,.nextByte dec b jr nz,.nextTile ;retrieve index of first tile to generate facings with pop af ;retrieve index of first tile call GenerateFacings ;expand 2 tiles into 6 tiles ;Increment number of FG tiles counter to account for the new ;tiles added in Generate Facings (4 for 1x1 or 12 for 2x2) ldio a,[curObjWidthHeight] ;xxFxxxxx rrca ;xxxFxxxx rrca ;xxxxFxxx and %00001000 ;0000F000 or %00000100 ;0000F100 4 or 12 ld b,a ld a,[numFGTiles] add b ld [numFGTiles],a ;store modified destptr (plus n*16 extra tiles) ld a,[fgDestPtr] ld e,a ld a,[fgDestPtr+1] ld d,a ld h,0 ld l,b ;num extra tiles swap l ;*16 add hl,de ld a,l ld [fgDestPtr],a ld a,h cp a,$98 jr c,.doneCheckNegative sub $10 .doneCheckNegative ld [fgDestPtr+1],a .done pop hl pop de pop bc pop af ret ;--------------------------------------------------------------------- ; Routine: LoadAssociatedClass ; Arguments: a - check if it exists already (1=yes, 0=no) ; c - class index of calling class method ; de - class ptr for new class (vector table address) ; hl - tile index of class to load ; Alters: af ; Description: Loads in the specified class IF NOT ALREADY PRESENT ; and regardless puts its index in the "associated" ; array of the calling class. ;--------------------------------------------------------------------- LoadAssociatedClass:: push bc push hl or a jr z,.notFound ;don't look for it push bc ld b,d ld c,e call FindClassIndex pop bc or a jr z,.notFound .foundMatch ld b,a jr .setAssociated .notFound ;------------------------------------------------------------- ;Didn't find it; go ahead and load it into the next available ;slot ;------------------------------------------------------------- ld a,l ld [loadTileL],a ld a,h ld [loadTileH],a ld a,[numClasses] inc a ld [numClasses],a ld b,a ld a,OBJLISTBANK ld [$ff70],a ;----------Set classLookup to point to vector table---------- ;set hl to point to classLookup[b] (times two) push de ld h,0 ld l,b sla l rl h ld de,classLookup add hl,de pop de ld [hl],e inc hl ld [hl],d ;-----------Load in the tile-------------------------------- push bc ld c,1 ;loading fg tile call LoadTile pop bc ld a,OBJROM call SetActiveROM .setAssociated ;------------------------------------------------------------- ;Expecting calling class index in c, new class index in b ;------------------------------------------------------------- call SetAssociated pop hl pop bc ret ;--------------------------------------------------------------------- ; Routine: SaveFGTileInfo ; Arguments: None. ; Alters: af ; Description: Saves [numClasses], [fgDestPtr], and [numFGTiles] into ; temporary variables. ;--------------------------------------------------------------------- SaveFGTileInfo:: push de push hl ld hl,numFGTiles ld a,[hl+] ;get numFGTiles ld [hl+],a ;put numFGTiles_save ld a,[hl+] ;get numClasses ld [hl+],a ;put numClasses_save ld a,[hl+] ;get fgTilePtrL ld e,a ld a,[hl+] ;get fgTilePtrH ld d,a ld a,e ld [hl+],a ;put fgTilePtrL ld [hl],d ;put fgTilePtrH pop hl pop de ret ;--------------------------------------------------------------------- ; Routine: RestoreFGTileInfo ; Arguments: None. ; Alters: af ; Description: Restores [numClasses], [fgDestPtr] and [numFGTiles] ; from temp vars. ;--------------------------------------------------------------------- RestoreFGTileInfo:: push de push hl ld hl,fgDestPtr_save+1 ld a,[hl-] ;get fgDestPtrH ld d,a ld a,[hl-] ;get fgDestPtrL ld e,a ld a,d ld [hl-],a ;put fgDestPtrH ld a,e ld [hl-],a ;put fgDestPtrL ld a,[hl-] ;get numClasses ld [hl-],a ;put numClasses ld a,[hl-] ;get numFGTiles ld [hl],a ;put numFGTiles pop hl pop de ret ;--------------------------------------------------------------------- ; Routine: SetupHero ; Arguments: a - type of exit to place hero at: ; 1=N, 2=E, 3=S, 4=W, 5=U, 6=D, 7=X ; bc - tile index of hero class to load ; d - hero number (0 or 1) ; hl - suggested location to start searching for exit ; in XY format. ; Alters: af ; Description: Loads in the hero tile & class ; Sets up [heroX_index], [heroX_class], [heroX_object] ; Sets heroes health to be [heroX_health] unless that's ; zero then it leaves it as initialized. ; Sets heroes puffCount from [heroX_puffCount] ;--------------------------------------------------------------------- SetupHero:: push bc push de push hl ld e,a ;save exit type for a bit ;save tile to load into method parameters ld a,c ld [loadTileL],a ld a,b ld [loadTileH],a ;pick one of two reserved tile sets to load hero into call SaveFGTileInfo ld a,d ;hero number or a jr nz,.loadHero1 ld a,[firstHero] ld [numClasses],a xor a ld bc,$9000 jr .decidedOnTileSet .loadHero1 ld a,[firstHero] add 2 ld [numClasses],a ld a,20 ld bc,$9140 .decidedOnTileSet ld [numFGTiles],a ld a,c ld [fgDestPtr],a ld a,b ld [fgDestPtr+1],a ld a,1 ldio [curObjWidthHeight],a .setupBC_heroX_index ;setup bc with addr of hero0_index or hero1_index ld bc,hero0_index ld a,d ;want hero 0 or 1? or a jr nz,.wantHero1 .wantHero0 ld a,[hero0_type] cp HERO_GRENADE_FLAG jr nz,.hero0_afterSetWH ld a,2 ldio [curObjWidthHeight],a .hero0_afterSetWH ld a,[heroesPresent] or %01 jr .heroDataPtrOkay .wantHero1 ld a,[hero1_type] cp HERO_GRENADE_FLAG jr nz,.hero1_afterSetWH ld a,2 ldio [curObjWidthHeight],a .hero1_afterSetWH ld a,[heroesPresent] or %10 ld c,(hero1_index & $ff) .heroDataPtrOkay ld [heroesPresent],a ld a,e ;retrieve desired exit push bc ;save &heroX_index call FindExitLocation ;returns exit loc in hl push hl ;save it for later ld h,b ld l,c ld a,[numClasses] inc a ld [numClasses],a ld b,a ld [hl+],a ;store class index in heroX_index inc hl ;hl = &heroX_classL inc hl inc hl push af ;save the hero class index call SetClassLookupEntryForTile ld c,1 ;loading fg tile call LoadTile ld a,OBJROM call SetActiveROM pop af ;retrieve hero class index ld c,a pop hl ;starting location call CreateObject ;returns objPtr in de pop hl ;retrieve &heroX_index inc hl ;hl = &heroX_objectL ld [hl],e inc hl ld [hl],d call RestoreFGTileInfo ld b,METHOD_INIT call CallMethod ;face opposite direction coming in call GetFacing and %11111000 ld b,a LDHL_CURHERODATA HERODATA_ENTERDIR ld a,[hl] cp EXIT_U jr c,.cardinal ;we're coming in up, down, or X; let's just face east ld a,DIR_EAST jr .gotDir .cardinal add 1 and %11 .gotDir or b call SetFacing ;reset health of hero ;push de ;ld a,l ;and (255 - (HERODATASIZE-1)) ;set back to heroX_data ;ld l,a ;ld de,HERODATA_HEALTH ;add hl,de ;pop de LDHL_CURHERODATA HERODATA_HEALTH ld a,[hl] or a jr z,.afterInitHealth ;push hl call SetHealth ;pop hl ;reset hero puffs LDHL_CURHERODATA HERODATA_PUFFCOUNT ld a,[hl] and %1111 call SetPuffCount ;inc hl ;inc hl ;hl = heroX_puffCount ;ld a,[hl] ;call SetPuffCount .afterInitHealth ld b,METHOD_DRAW call CallMethod pop hl pop de pop bc ret ;--------------------------------------------------------------------- ; Routine: FindExitLocation ; Arguments: a - type of exit to find: ; 1=N, 2=E, 3=S, 4=W, 5=U, 6=D, 7=X ; hl - "suggested" location to start searching for exit ; in XY format. ; [curObjWidthHeight] ; Returns: hl - location of first exit found or $0000 ; Alters: af ; Description: First adjusts suggested location to be opposite side ; if NESW and restricts it to map bounds. ; ; Searches forward through the map beginning at hl and ; stopping on an exit of the specified type. ; ; If there are no exits found once it reaches the end ; of the map it searches through once more starting at ; the first map cell. If there are STILL no exits found ; it returns location (1,1). ;--------------------------------------------------------------------- FindExitLocation:: push bc push de ld b,a ;save exit type ;swap sides if exit type is NESW ld a,b dec a and %11111100 jr nz,.afterSwapExit ld a,b dec a bit 0,a jr nz,.east_or_west ;north or south bit 1,a jr nz,.south .north ;looking for north entrance so coming from south, place at top ld l,1 jr .afterSwapExit .south ;entering south means coming from north, place at bottom ld a,[mapHeight] dec a dec a ld l,a jr .afterSwapExit .east_or_west bit 0,a jr nz,.west ;entering east, place at right ld a,[mapWidth] dec a dec a ld h,a jr .afterSwapExit .west ;entering west, place at left ld h,1 .afterSwapExit ;make sure x & y are within bounds ld a,[mapWidth] cp h ;width > x? jr z,.xOutOfBounds jr nc,.xInBounds .xOutOfBounds sub 2 ;x out-of-bounds, set to width-2 ld h,a .xInBounds ld a,[mapHeight] cp l jr z,.yOutOfBounds jr nc,.yInBounds .yOutOfBounds sub 2 ld l,a .yInBounds call ConvertXYToLocHL ;location back to ptr swap b ld c,$f0 ;put mask in register for faster ANDing ;setup de with first out-of-bounds index ld a,[mapTotalSize] ld e,a ld a,[mapTotalSize+1] ld d,a ld a,ZONEBANK ld [$ff70],a .loop ld a,h cp d jr nz,.continue ld a,l cp e jr nz,.continue ;reached end of map jr .didntFind .continue ld a,[hl+] and c cp b jr nz,.loop ;found an exit location; see if it's empty call .isValidExit jr nz,.done inc hl jr .loop .didntFind ;look again starting at beginning ld hl,map ld a,[mapHeight] ld d,a .outer ld a,[mapPitch] ld e,a .inner ld a,[hl+] and c cp b jr nz,.notFoundYet ;maybe found; check if map location occupied call .isValidExit jr nz,.done inc hl .notFoundYet dec e jr nz,.inner dec d jr nz,.outer ;didnt find it after searching the WHOLE map ld hl,$0000 .done pop de pop bc ret .isValidExit ld a,MAPBANK ld [$ff70],a dec hl ld a,[hl] ;get this location in the map array push af ;save it for a sec ld a,ZONEBANK ;switch back to zones just in case ld [$ff70],a pop af or a jr nz,.validFalse ldio a,[curObjWidthHeight] cp 1 jr z,.validTrue ;2x2; must check locations to right, down-right, and down ld a,MAPBANK ld [$ff70],a push hl inc hl ld a,[hl] or a jr nz,.validFalseCleanUp push de ld d,0 ld a,[mapPitch] ld e,a add hl,de pop de ld a,[hl] or a jr nz,.validFalseCleanUp dec hl ld a,[hl] or a jr nz,.validFalseCleanUp .validTrueCleanUp pop hl ld a,ZONEBANK ;switch back to zones ld [$ff70],a jr .validTrue .validFalseCleanUp pop hl ld a,ZONEBANK ;switch back to zones ld [$ff70],a xor a ret .validTrue ld a,1 or a ret .validFalse xor a ret ;--------------------------------------------------------------------- ; Routine: FindClassIndex ; Arguments: bc - class to find ; Returns: a - class index ; zflag - result of "OR a" ; Alters: af ; Description: Finds first class index of class "bc" & returns class ; index or 0 if it doesn't exist ;--------------------------------------------------------------------- FindClassIndex:: push de push hl ld a,OBJLISTBANK ld [$ff70],a ld a,[numClasses] ld d,a ld e,1 ld hl,classLookup+2 .loop ld a,[hl+] cp c jr nz,.afterCheck ld a,[hl] cp b jr nz,.afterCheck ;found it! ld a,e ;a is class index or a pop hl pop de ret .afterCheck inc hl inc e dec d jr nz,.loop pop hl pop de xor a ;didn't find it ret ;--------------------------------------------------------------------- ; Routine: ChangeClass ; Arguments: bc - class to change ; de - pointer to new class ; Alters: af,hl ; Description: Changes all objects of the "old" class type to the ; "new" class type ;--------------------------------------------------------------------- ChangeClass:: ld a,OBJLISTBANK ld [$ff70],a ld a,$ff ld hl,classLookup+2 .loop push af ld a,[hl+] cp c jr nz,.afterCheck ld a,[hl] cp b jr nz,.afterCheck ;replace old class with new ld [hl],d dec hl ld [hl],e inc hl .afterCheck inc hl pop af dec a jr nz,.loop ret ;--------------------------------------------------------------------- ; Routine: ChangeFirstClass ; Arguments: bc - class to change ; de - pointer to new class ; Alters: af,hl ; Description: Changes of first class found to match the "old" class ; type to the "new" class type ;--------------------------------------------------------------------- ChangeFirstClass:: ld a,OBJLISTBANK ld [$ff70],a ld a,$ff ld hl,classLookup+2 .loop push af ld a,[hl+] cp c jr nz,.afterCheck ld a,[hl] cp b jr nz,.afterCheck ;replace old class with new ld [hl],d dec hl ld [hl],e inc hl pop af ret .afterCheck inc hl pop af dec a jr nz,.loop ret ;--------------------------------------------------------------------- ; Routines: CopyMapMethodToRAM ; Arguments: a - offset of method in map contents ; [mapMethodContents] be set up ; Returns: nothing. ; Alters: nothing. ; Description: Copies the Map Check or Init Method to RAM so it can ; be called w/o switching ROM banks ;--------------------------------------------------------------------- CopyMapMethodToRAM:: push af push bc push de push hl call LookupInMapContents ;set hl to point to source ;setup bc as # bytes to copy ld c,[hl] ;low byte of size inc hl ld b,[hl] ;high byte of size inc hl ld de,levelCheckRAM ;dest addr ;copy sets of 256 ld a,b or a jr z,.copy_lt_256 push bc .outer ld c,0 .inner ld a,[hl+] ld [de],a inc de dec c jr nz,.inner dec b jr nz,.outer pop bc .copy_lt_256 ;copy remaining < 256 bytes ld a,c or a jr z,.done .loop ld a,[hl+] ld [de],a inc de dec c jr nz,.loop .done pop hl pop de pop bc pop af ret ;--------------------------------------------------------------------- ; Routine: HandleExitFromMap ; Arguments: c - hero class index ; de - ptr to object ; Returns: Nothing. ; Alters: af ; Description: If the hero exiting is the one controlled by this ; machine, sets the paramaters which will cause a new ; map to be loaded (in user.asm) if the exit has a map ; associated with it. ; ; Deletes the remote hero if an exit is found. ;--------------------------------------------------------------------- HandleExitFromMap:: push bc push de push hl ;save exit type in B call GetCurLocation ldio a,[curObjWidthHeight] cp 2 jr nz,.locationSet call GetFacing and %11 cp DIR_NORTH jr z,.locationSet cp DIR_WEST jr z,.locationSet push af call ConvertLocHLToXY pop af cp DIR_EAST jr z,.incH inc l jr .locationAltered .incH inc h .locationAltered call ConvertXYToLocHL .locationSet ld a,ZONEBANK ld [$ff70],a ld a,[hl] swap a and %00000111 ld b,a ;save exit location as entry location call ConvertLocHLToXY push de ld d,((hero0_data>>8) & $ff) ld a,[curHeroAddressL] add HERODATA_ENTERLOC ld e,a ld a,l ld [de],a inc de ld a,h ld [de],a pop de ;lookup link in link table ld a,b sla a add (mapExitLinks & $ff) ld l,a ld a,0 adc ((mapExitLinks>>8) & $ff) ld h,a ;store 16-bit BCD link value in hl ld a,[hl+] ld h,[hl] ld l,a ld a,$40 cp h jr nz,.linkOkay cp l jr nz,.linkOkay jp .done ;link is $4040 = (+0,+0) = no link .linkOkay ;if remote hero exiting then don't change my map push hl LDHL_CURHERODATA HERODATA_INDEX ld a,[hl] pop hl cp c ;cur hero index == cur index? jr z,.localHero jp .removeRemoteHero .localHero call RemoveHero ld a,h ;x link/offset and %11000000 jr nz,.xlinkRelative ld a,h jr .doY .xlinkRelative bit 6,h ;positive offset? jr z,.negative_x_offset ;positive offset call .setupH call BCDToNumber add h call NumberToBCD jr .doY .negative_x_offset call .setupH call BCDToNumber sub h call NumberToBCD jr .doY .setupH ld a,h and %00111111 ld h,a ld a,[curLevelIndex+1] ret .doY ld [curLevelIndex+1],a ld a,l ;y link/offset and %11000000 jr nz,.ylinkRelative ld a,l jr .finishedY .ylinkRelative bit 6,l ;positive offset? jr z,.negative_y_offset ;positive offset call .setupL call BCDToNumber add l call NumberToBCD jr .finishedY .negative_y_offset call .setupL call BCDToNumber sub l call NumberToBCD jr .finishedY .setupL ld a,l and %00111111 ld l,a ld a,[curLevelIndex] ret .finishedY ld [curLevelIndex],a ld a,1 ld [timeToChangeLevel],a ;switch NESW to be opposite ld a,b dec a and %11111100 jr nz,.switchUp ld a,b inc a ;same as a--, a+=2 and %00000011 inc a ld b,a jr .afterSwitchToOpposite .switchUp ld a,b cp EXIT_U jr nz,.switchDown ld b,EXIT_D ld a,b jr .afterSwitchToOpposite .switchDown cp EXIT_D jr nz,.afterSwitchToOpposite ld b,EXIT_U ld a,b .afterSwitchToOpposite LDHL_CURHERODATA HERODATA_ENTERDIR ld a,b ld [hl],a .updateState ;don't update the state if it's an asynchronous can-join ;map or a cinema ld a,[canJoinMap] cp 2 jr z,.afterUpdateState ld a,[displayType] cp 1 jr z,.afterUpdateState call UpdateState .removeRemoteHero call RemoveHero .afterUpdateState .zeroIndex ld a,[hero0_index] cp c jr nz,.zeroIndex1 xor a ld [hero0_index],a jr .done .zeroIndex1 ld a,[hero1_index] cp c jr nz,.done xor a ld [hero1_index],a .done pop hl pop de pop bc ret UpdateState:: ld a,[amLinkMaster] bit 7,a ret nz ;no link .updateState ld a,LUPDATESTATE call ExchangeByte call CheckSimultaneousLCC jr nz,.updateState ;must repeat ld a,[curLevelStateIndex] call TransmitByte ldio a,[mapState] or a jr nz,.stateNotZero ld a,1 .stateNotZero call TransmitByte ret ;--------------------------------------------------------------------- ; Routines: HasInventoryItem ; AddInventoryItem ; RemoveInventoryItem ; Arguments: bc - b=item byte, c=bitmask ; Alters: af ; Returns: a, zflag ; Description: Returns !0 if inventory item exists, 0 otherwise ;--------------------------------------------------------------------- HasInventoryItem:: push hl call PointHLToInventory pop hl and c ret AddInventoryItem:: ;duplicate code also in user.asm push hl call PointHLToInventory or c ld [hl],a ld a,[amLinkMaster] bit 7,a jr nz,.afterUpdateRemote .updateRemote ld a,LADDINVITEM call ExchangeByte call CheckSimultaneousLCC jr nz,.updateRemote ;must repeat ld a,c call TransmitByte ld a,b call TransmitByte .afterUpdateRemote pop hl ret RemoveInventoryItem:: ;duplicate code also in user.asm push hl call PointHLToInventory xor $ff or c xor $ff ld [hl],a ld a,[amLinkMaster] bit 7,a jr nz,.afterUpdateRemote .updateRemote ld a,LREMINVITEM call ExchangeByte call CheckSimultaneousLCC jr nz,.updateRemote ;must repeat ld a,c call TransmitByte ld a,b call TransmitByte .afterUpdateRemote pop hl ret PointHLToInventory:: ld h,((inventory>>8)&$ff) ld a,(inventory & $ff) add b ld l,a ld a,[hl] ret ;--------------------------------------------------------------------- ; Routines: GetFirstInventoryIndex ; GetNextInventoryIndex ; Arguments: a - previous inventory index (for GetNextII) ; Alters: af ; Description: Returns $ff for none, index otherwise (0,1,2,....) ;--------------------------------------------------------------------- GetFirstInventoryIndex: ld a,$ff GetNextInventoryIndex: inc a cp 48 ;reached max inventory items? jr c,.notDone ld a,$ff ret .notDone push bc push de push hl ld b,a ;position hl at current byte of inventory ld h,((inventory >> 8) & $ff) rrca ;itemIndex /= 8 rrca rrca and %00011111 add (inventory & $ff) ld l,a ;jump to routine checking appropriate bit of inventory ld a,b rlca and %1110 add (.vectorTable & $ff) ld e,a ld a,0 adc ((.vectorTable>>8) & $ff) ld d,a ld a,[hl] push de ;jump to [de] ret .vectorTable jr .bit0 jr .bit1 jr .bit2 jr .bit3 jr .bit4 jr .bit5 jr .bit6 jr .bit7 .bit0 bit 0,a jr nz,.foundIt inc b .bit1 bit 1,a jr nz,.foundIt inc b .bit2 bit 2,a jr nz,.foundIt inc b .bit3 bit 3,a jr nz,.foundIt inc b .bit4 bit 4,a jr nz,.foundIt inc b .bit5 bit 5,a jr nz,.foundIt inc b .bit6 bit 6,a jr nz,.foundIt inc b .bit7 bit 7,a jr nz,.foundIt inc b inc hl ld a,l cp ((inventory+16)&$ff) jr z,.didntFind ld a,[hl] jr .bit0 .didntFind ld a,$ff jr .done .foundIt ld a,b ;index .done pop hl pop de pop bc ret ;--------------------------------------------------------------------- ; Routine: State0To1 ; Arguments: [mapState] ; Alters: af, [mapState] ; Returns: a - [mapState] ; Description: If [mapState] is 0 it is changed to 1, otherwise it ; is unmodified. The new map state is returned in a. ;--------------------------------------------------------------------- State0To1:: ldio a,[mapState] or a ret nz ld a,1 ldio [mapState],a ret ;--------------------------------------------------------------------- ; map data ;--------------------------------------------------------------------- SECTION "MapSupportSection",ROMX ;--------------------------------------------------------------------- ; Routine: GuestContinueSynchronization ; Arguments: None. ; Alters: af ; Returns: Nothing. ; Description: ;--------------------------------------------------------------------- GuestContinueSynchronization:: push bc push de push hl xor a ld [backBufferReady],a ld a,LSYNCHREADY call TransmitByte ;receive fresh copy of all my hero data from host ld hl,hero0_data ld bc,HERODATASIZE*2 xor a call ReceiveData LONGCALLNOARGS ResetList call ReceiveByte ld [randomLoc],a call ReceiveByte ld [heroesIdle],a ld hl,map ld bc,4096 ld a,MAPBANK call ReceiveData ;fadeCurPalette ld hl,fadeCurPalette ld bc,128 xor a call ReceiveData ;gamePalette ld hl,gamePalette ld bc,128 ld a,FADEBANK call ReceiveData ;first 16 bytes of level check RAM ld hl,levelCheckRAM ld bc,16 xor a call ReceiveData ;spriteOAMdata ld hl,spriteOAMBuffer ld bc,160 xor a call ReceiveData ld hl,headTable ;headTable - linked list head ld bc,256 ld a,OBJLISTBANK call ReceiveData ld hl,objExists ;objExists, FOF table ld bc,512 ld a,OBJLISTBANK call ReceiveCompressedData call ReceiveByte ld [numClasses],a ld b,0 ;bc = numClasses*2 + 2 ld c,a sla c rl b inc bc inc bc ld hl,classLookup ;ld bc,512 numClasses*2 ld a,OBJLISTBANK call ReceiveData ld hl,fgTileMap ld a,[numClasses] ld b,0 ld c,a ld a,OBJLISTBANK call ReceiveData ld hl,objClassLookup ;class indices for each obj ld bc,256 ld a,OBJLISTBANK call ReceiveData ld hl,associatedIndex ld bc,256 ld a,OBJLISTBANK call ReceiveData ld hl,spritesUsed ld bc,40 ld a,OBJLISTBANK call ReceiveCompressedData ;---------------receive used objects------------------------- ld a,OBJLISTBANK ld [$ff70],a ld de,objExists+1 .receiveUsedObject ld a,[de] ;is this object used? or a jr z,.afterReceiveUsedObject ;not used PREPLONGCALL .afterCvtIndexToPtr ld a,e ;get object index LONGCALL IndexToPointerHL ;cvt to ptr .afterCvtIndexToPtr ld bc,16 ld a,OBJBANK call ReceiveData ld a,OBJLISTBANK ld [$ff70],a .afterReceiveUsedObject inc de ld a,e or a jr nz,.receiveUsedObject call ReceiveByte ld [numFreeSprites],a call ReceiveByte ld [firstFreeObj],a call ReceiveByte ld [randomLoc],a call ReceiveByte ld [guardAlarm],a ;call ReceiveByte ;ld [dialogBank],a call ReceiveByte ld [respawnMap],a call ReceiveByte ld [respawnMap+1],a call ReceiveByte ldio [mapState],a call ReceiveByte ldio [mapState+1],a ld hl,levelVars ld bc,64 xor a call ReceiveData ;my music to off xor a ld [musicEnabled],a ld hl,musicBank ld bc,64 xor a call ReceiveData ;setup the wave table ld c,16 ld de,$ff30 ld hl,musicWaveform .setupWave ld a,[hl+] ld [de],a inc de dec c jr nz,.setupWave ;set default instruments ld hl,musicInstrument1 ld de,$ff10 ld bc,4 xor a call MemCopy ld hl,musicInstrument2 ld de,$ff16 ld bc,3 call MemCopy ld hl,musicInstrument3 ld de,$ff31 call MemCopy ld hl,musicInstrument4 ld de,$ff20 call MemCopy ;disable sound xor a ldio [$ff26],a ldio [$ff12],a ;zero envelope all instruments ldio [$ff17],a ldio [$ff1c],a ldio [$ff21],a ;enable sound ld a,$80 ldio [$ff26],a ;master ld a,$ff ldio [$ff24],a ;volume ldio [$ff25],a ;sound output terminals ld hl,musicStack ld bc,128 ld a,MUSICBANK call ReceiveData call ReceiveByte ldio [musicEnabled],a LONGCALLNOARGS LinkRemakeLists .done pop hl pop de pop bc ret ;--------------------------------------------------------------------- ; Routine: RandomizeFlightCodes ; Arguments: None. ; Alters: all ; Returns: Nothing. ; Description: Randomizes the flight codes ;--------------------------------------------------------------------- RandomizeFlightCodes:: ;randomize 11/15 flight codes ld a,FLIGHTCODEBANK ldio [$ff70],a ldio a,[randomLoc] push af ldio a,[vblankTimer] ldio [randomLoc],a ld hl,flightCode+1 ld a,11 .loop push af ;get a random octal coordinate in bc ld a,7 call GetRandomNumMask swap a ld b,a ld a,7 call GetRandomNumMask or b ld b,a ld a,7 call GetRandomNumMask swap a ld c,a ld a,7 call GetRandomNumMask or c ld c,a .validateCode call .checkCodeExists jr nz,.placeCode call .incrementCode jr .validateCode .placeCode ld [hl],c inc hl ld [hl],b inc hl inc hl pop af dec a jr nz,.loop ldio a,[randomLoc] ldio [asyncRandLoc],a pop af ldio [randomLoc],a ret .incrementCode ;separate code bc into bcde ld a,c and 7 ld e,a ld a,c swap a and 7 ld d,a ld a,b and 7 ld c,a ld a,b swap a and 7 ld b,a inc e ld a,e cp 8 jr nz,.incrementDone ld e,0 inc d ld a,d cp 8 jr nz,.incrementDone ld d,0 inc c ld a,c cp 8 jr nz,.incrementDone ld c,0 inc b ld a,b cp 8 jr nz,.incrementDone ld b,0 .incrementDone ;reassemble bcde into bc swap b ld a,c or b ld b,a swap d ld a,e or d ld c,a ret .checkCodeExists push bc push hl ld hl,flightCode ld c,[hl] inc hl .checkCodeLoop ld a,[hl+] cp c jr nz,.keepGoing ld a,[hl] cp b jr nz,.keepGoing ;found a match :( xor a pop hl pop bc ret .keepGoing inc hl inc hl dec c jr nz,.checkCodeLoop ;no match! ld a,1 or a pop hl pop bc ret ;WARNING not home section ;--------------------------------------------------------------------- ; map data ;--------------------------------------------------------------------- SECTION "MapLookupTableSection",ROMX MapLookupTable: ;calculate index number 0-255 from xxyy with "i = yy*16 + xx" ;e.g. L0205 = 5*16 + 2 = 82 DW BANK(L0000_Contents),L0000_Contents ;0 The Hive DW BANK(L0100_Contents),L0100_Contents ;1 DW BANK(L0200_Contents),L0200_Contents ;2 DW BANK(L0300_Contents),L0300_Contents ;3 DW BANK(L0400_Contents),L0400_Contents ;4 DW BANK(L0500_Contents),L0500_Contents ;5 DW BANK(L0600_Contents),L0600_Contents ;6 DW BANK(L0700_Contents),L0700_Contents ;7 DW BANK(L0800_Contents),L0800_Contents ;8 DW BANK(L0900_Contents),L0900_Contents ;9 DW BANK(L1000_Contents),L1000_Contents ;10 DW BANK(L1100_Contents),L1100_Contents ;11 (1100, char select) DW BANK(L1200_Contents),L1200_Contents ;12 (1200, demo intro) DW BANK(L1300_Contents),L1300_Contents ;13 DW BANK(L1400_Contents),L1400_Contents ;14 DW BANK(L1500_Contents),L1500_Contents ;15 DW BANK(L0001_Contents),L0001_Contents ;16 DW BANK(L0101_Contents),L0101_Contents ;17 DW BANK(L0201_Contents),L0201_Contents ;18 DW BANK(L0301_Contents),L0301_Contents ;19 DW BANK(L0401_Contents),L0401_Contents ;20 DW BANK(L0501_Contents),L0501_Contents ;21 DW BANK(L0601_Contents),L0601_Contents ;22 DW BANK(L0701_Contents),L0701_Contents ;23 DW BANK(L0801_Contents),L0801_Contents ;24 DW BANK(L0901_Contents),L0901_Contents ;25 DW BANK(L1001_Contents),L1001_Contents ;26 DW BANK(L1101_Contents),L1101_Contents ;27 (1101, Main Menu) DW BANK(L1201_Contents),L1201_Contents ;28 (join game) DW BANK(L1301_Contents),L1301_Contents ;29 DW BANK(L1401_Contents),L1401_Contents ;30 DW BANK(L1501_Contents),L1501_Contents ;31 DW BANK(L0002_Contents),L0002_Contents ;32 DW BANK(L0102_Contents),L0102_Contents ;33 DW BANK(L0202_Contents),L0202_Contents ;34 DW BANK(L0302_Contents),L0302_Contents ;35 DW BANK(L0402_Contents),L0402_Contents ;36 DW BANK(L0502_Contents),L0502_Contents ;37 DW BANK(L0602_Contents),L0602_Contents ;38 DW BANK(L0702_Contents),L0702_Contents ;39 DW BANK(L0802_Contents),L0802_Contents ;40 DW BANK(L0902_Contents),L0902_Contents ;41 DW BANK(L1002_Contents),L1002_Contents ;42 DW BANK(L1102_Contents),L1102_Contents ;43 (1102, main intro) DW BANK(L1202_Contents),L1202_Contents ;44 (1202, dropship lv v.t.) DW BANK(L1302_Contents),L1302_Contents ;45 (1302 ba corners gyro) DW BANK(L1402_Contents),L1402_Contents ;46 (1402 b12 surrenders) DW BANK(L1502_Contents),L1502_Contents ;47 DW BANK(L0003_Contents),L0003_Contents ;48 DW BANK(L0103_Contents),L0103_Contents ;49 DW BANK(L0203_Contents),L0203_Contents ;50 DW BANK(L0303_Contents),L0303_Contents ;51 DW BANK(L0403_Contents),L0403_Contents ;52 DW BANK(L0503_Contents),L0503_Contents ;53 DW BANK(L0603_Contents),L0603_Contents ;54 DW BANK(L0703_Contents),L0703_Contents ;55 DW BANK(L0803_Contents),L0803_Contents ;56 DW BANK(L0903_Contents),L0903_Contents ;57 DW BANK(L1003_Contents),L1003_Contents ;58 DW BANK(L1103_Contents),L1103_Contents ;59 DW BANK(L1203_Contents),L1203_Contents ;60 DW BANK(L1303_Contents),L1303_Contents ;61 DW BANK(L1403_Contents),L1403_Contents ;62 DW BANK(L1503_Contents),L1503_Contents ;63 DW BANK(L0004_Contents),L0004_Contents ;64 DW BANK(L0104_Contents),L0104_Contents ;65 DW BANK(L0204_Contents),L0204_Contents ;66 DW BANK(L0304_Contents),L0304_Contents ;67 0304 shroom DW BANK(L0404_Contents),L0404_Contents ;68 DW BANK(L0504_Contents),L0504_Contents ;69 DW BANK(L0604_Contents),L0604_Contents ;70 DW BANK(L0704_Contents),L0704_Contents ;71 DW BANK(L0804_Contents),L0804_Contents ;72 DW BANK(L0904_Contents),L0904_Contents ;73 DW BANK(L1004_Contents),L1004_Contents ;74 DW BANK(L1104_Contents),L1104_Contents ;75 DW BANK(L1204_Contents),L1204_Contents ;76 DW BANK(L1304_Contents),L1304_Contents ;77 DW BANK(L1404_Contents),L1404_Contents ;78 DW BANK(L1504_Contents),L1504_Contents ;79 DW BANK(L0005_Contents),L0005_Contents ;80 DW BANK(L0105_Contents),L0105_Contents ;81 path DW BANK(L0205_Contents),L0205_Contents ;82 bridge DW BANK(L0305_Contents),L0305_Contents ;83 DW BANK(L0405_Contents),L0405_Contents ;84 DW BANK(L0505_Contents),L0505_Contents ;85 DW BANK(L0605_Contents),L0605_Contents ;86 DW BANK(L0705_Contents),L0705_Contents ;87 DW BANK(L0805_Contents),L0805_Contents ;88 DW BANK(L0905_Contents),L0905_Contents ;89 DW BANK(L1005_Contents),L1005_Contents ;90 DW BANK(L1105_Contents),L1105_Contents ;91 DW BANK(L1205_Contents),L1205_Contents ;92 DW BANK(L1305_Contents),L1305_Contents ;93 DW BANK(L1405_Contents),L1405_Contents ;94 DW BANK(L1505_Contents),L1505_Contents ;95 DW BANK(L0006_Contents),L0006_Contents ;96 DW BANK(L0106_Contents),L0106_Contents ;97 path DW BANK(L0206_Contents),L0206_Contents ;98 DW BANK(L0306_Contents),L0306_Contents ;99 DW BANK(L0406_Contents),L0406_Contents ;100 DW BANK(L0506_Contents),L0506_Contents ;101 DW BANK(L0606_Contents),L0606_Contents ;102 DW BANK(L0706_Contents),L0706_Contents ;103 DW BANK(L0806_Contents),L0806_Contents ;104 DW BANK(L0906_Contents),L0906_Contents ;105 DW BANK(L1006_Contents),L1006_Contents ;106 DW BANK(L1106_Contents),L1106_Contents ;107 DW BANK(L1206_Contents),L1206_Contents ;108 DW BANK(L1306_Contents),L1306_Contents ;109 DW BANK(L1406_Contents),L1406_Contents ;110 DW BANK(L1506_Contents),L1506_Contents ;111 DW BANK(L0007_Contents),L0007_Contents ;112 DW BANK(L0107_Contents),L0107_Contents ;113 path DW BANK(L0207_Contents),L0207_Contents ;114 DW BANK(L0307_Contents),L0307_Contents ;115 DW BANK(L0407_Contents),L0407_Contents ;116 DW BANK(L0507_Contents),L0507_Contents ;117 DW BANK(L0607_Contents),L0607_Contents ;118 DW BANK(L0707_Contents),L0707_Contents ;119 DW BANK(L0807_Contents),L0807_Contents ;120 DW BANK(L0907_Contents),L0907_Contents ;121 DW BANK(L1007_Contents),L1007_Contents ;122 DW BANK(L1107_Contents),L1107_Contents ;123 DW BANK(L1207_Contents),L1207_Contents ;124 DW BANK(L1307_Contents),L1307_Contents ;125 DW BANK(L1407_Contents),L1407_Contents ;126 DW BANK(L1507_Contents),L1507_Contents ;127 DW BANK(L0008_Contents),L0008_Contents DW BANK(L0108_Contents),L0108_Contents DW BANK(L0208_Contents),L0208_Contents DW BANK(L0308_Contents),L0308_Contents DW BANK(L0408_Contents),L0408_Contents DW BANK(L0508_Contents),L0508_Contents DW BANK(L0608_Contents),L0608_Contents DW BANK(L0708_Contents),L0708_Contents DW BANK(L0808_Contents),L0808_Contents DW BANK(L0908_Contents),L0908_Contents DW BANK(L1008_Contents),L1008_Contents DW BANK(L1108_Contents),L1108_Contents DW BANK(L1208_Contents),L1208_Contents DW BANK(L1308_Contents),L1308_Contents DW BANK(L1408_Contents),L1408_Contents DW BANK(L1508_Contents),L1508_Contents DW BANK(L0009_Contents),L0009_Contents DW BANK(L0109_Contents),L0109_Contents DW BANK(L0209_Contents),L0209_Contents DW BANK(L0309_Contents),L0309_Contents DW BANK(L0409_Contents),L0409_Contents DW BANK(L0509_Contents),L0509_Contents DW BANK(L0609_Contents),L0609_Contents DW BANK(L0709_Contents),L0709_Contents DW BANK(L0809_Contents),L0809_Contents DW BANK(L0909_Contents),L0909_Contents DW BANK(L1009_Contents),L1009_Contents DW BANK(L1109_Contents),L1109_Contents DW BANK(L1209_Contents),L1209_Contents DW BANK(L1309_Contents),L1309_Contents DW BANK(L1409_Contents),L1409_Contents DW BANK(L1509_Contents),L1509_Contents DW BANK(L0010_Contents),L0010_Contents DW BANK(L0110_Contents),L0110_Contents DW BANK(L0210_Contents),L0210_Contents DW BANK(L0310_Contents),L0310_Contents DW BANK(L0410_Contents),L0410_Contents DW BANK(L0510_Contents),L0510_Contents DW BANK(L0610_Contents),L0610_Contents DW BANK(L0710_Contents),L0710_Contents DW BANK(L0810_Contents),L0810_Contents DW BANK(L0910_Contents),L0910_Contents DW BANK(L1010_Contents),L1010_Contents DW BANK(L1110_Contents),L1110_Contents DW BANK(L1210_Contents),L1210_Contents DW BANK(L1310_Contents),L1310_Contents DW BANK(L1410_Contents),L1410_Contents DW BANK(L1510_Contents),L1510_Contents DW BANK(L0011_Contents),L0011_Contents DW BANK(L0111_Contents),L0111_Contents DW BANK(L0211_Contents),L0211_Contents DW BANK(L0311_Contents),L0311_Contents DW BANK(L0411_Contents),L0411_Contents DW BANK(L0511_Contents),L0511_Contents DW BANK(L0611_Contents),L0611_Contents DW BANK(L0711_Contents),L0711_Contents DW BANK(L0811_Contents),L0811_Contents DW BANK(L0911_Contents),L0911_Contents DW BANK(L1011_Contents),L1011_Contents DW BANK(L1111_Contents),L1111_Contents DW BANK(L1211_Contents),L1211_Contents DW BANK(L1311_Contents),L1311_Contents DW BANK(L1411_Contents),L1411_Contents DW BANK(L1511_Contents),L1511_Contents DW BANK(L0012_Contents),L0012_Contents DW BANK(L0112_Contents),L0112_Contents DW BANK(L0212_Contents),L0212_Contents DW BANK(L0312_Contents),L0312_Contents DW BANK(L0412_Contents),L0412_Contents DW BANK(L0512_Contents),L0512_Contents DW BANK(L0612_Contents),L0612_Contents DW BANK(L0712_Contents),L0712_Contents DW BANK(L0812_Contents),L0812_Contents DW BANK(L0912_Contents),L0912_Contents DW BANK(L1012_Contents),L1012_Contents DW BANK(L1112_Contents),L1112_Contents DW BANK(L1212_Contents),L1212_Contents DW BANK(L1312_Contents),L1312_Contents DW BANK(L1412_Contents),L1412_Contents DW BANK(L1512_Contents),L1512_Contents DW BANK(L0013_Contents),L0013_Contents ;208 intro_ba1 DW BANK(L0113_Contents),L0113_Contents ;209 intro_ba2 DW BANK(L0213_Contents),L0213_Contents ;210 intro_ba3 DW BANK(L0313_Contents),L0313_Contents ;211 intro_ba4 DW BANK(L0413_Contents),L0413_Contents ;212 DW BANK(L0513_Contents),L0513_Contents ;213 DW BANK(L0613_Contents),L0613_Contents ;214 DW BANK(L0713_Contents),L0713_Contents ;215 DW BANK(L0813_Contents),L0813_Contents ;216 DW BANK(L0913_Contents),L0913_Contents ;217 DW BANK(L1013_Contents),L1013_Contents ;218 DW BANK(L1113_Contents),L1113_Contents ;219 DW BANK(L1213_Contents),L1213_Contents ;220 DW BANK(L1313_Contents),L1313_Contents ;221 DW BANK(L1413_Contents),L1413_Contents ;222 DW BANK(L1513_Contents),L1513_Contents ;223 DW BANK(L0014_Contents),L0014_Contents ;224 intro haiku 1 DW BANK(L0114_Contents),L0114_Contents ;225 intro haiku 2 DW BANK(L0214_Contents),L0214_Contents ;226 intro haiku 3 DW BANK(L0314_Contents),L0314_Contents ;227 intro haiku 4 (escape) DW BANK(L0414_Contents),L0414_Contents ;228 DW BANK(L0514_Contents),L0514_Contents ;229 DW BANK(L0614_Contents),L0614_Contents ;230 DW BANK(L0714_Contents),L0714_Contents ;231 DW BANK(L0814_Contents),L0814_Contents ;232 DW BANK(L0914_Contents),L0914_Contents ;233 DW BANK(L1014_Contents),L1014_Contents ;234 DW BANK(L1114_Contents),L1114_Contents ;235 DW BANK(L1214_Contents),L1214_Contents ;236 DW BANK(L1314_Contents),L1314_Contents ;237 DW BANK(L1414_Contents),L1414_Contents ;238 DW BANK(L1514_Contents),L1514_Contents ;239 DW BANK(L0015_Contents),L0015_Contents ;240 intro bs 1 DW BANK(L0115_Contents),L0115_Contents ;241 intro bs 2 DW BANK(L0215_Contents),L0215_Contents ;242 intro bs 3 DW BANK(L0315_Contents),L0315_Contents ;243 intro bs 4 DW BANK(L0415_Contents),L0415_Contents ;244 DW BANK(L0515_Contents),L0515_Contents ;245 DW BANK(L0615_Contents),L0615_Contents ;246 DW BANK(L0715_Contents),L0715_Contents ;247 DW BANK(L0815_Contents),L0815_Contents ;248 DW BANK(L0915_Contents),L0915_Contents ;249 DW BANK(L1015_Contents),L1015_Contents ;250 DW BANK(L1115_Contents),L1115_Contents ;251 DW BANK(L1215_Contents),L1215_Contents ;252 DW BANK(L1315_Contents),L1315_Contents ;253 DW BANK(L1415_Contents),L1415_Contents ;254 DW BANK(L1515_Contents),L1515_Contents ;255 ;SECTION "BGTileSection",ROMX,BANK[BGTILEROM] SECTION "BGTileSection",ROMX[$4000],BANK[BGTILEROM1] BGTiles:: DB 0,0,0,0, 0,0,0,0, 0,0,0,0,0,0,0,0 ;blank tile zero INCBIN "Data/Tiles/bgTiles1-256.bin" INCBIN "Data/Tiles/bgTiles257-512.bin" INCBIN "Data/Tiles/bgTiles513-768.bin" INCBIN "Data/Tiles/bgTiles769-979.bin" SECTION "BGTileSection2",ROMX[$4000],BANK[BGTILEROM2] BGTiles1024:: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 INCBIN "Data/Tiles/bgTiles1024-1279.bin" INCBIN "Data/Tiles/bgTiles1280-1535.bin" INCBIN "Data/Tiles/bgTiles1536-1791.bin" INCBIN "Data/Tiles/bgTiles1792-2047.bin" ;DS 16*((1024-256)-1) ;pad tiles SECTION "BGColorTable",ROMX[$4000] bg_colorTable:: ;defines a byte for the tile attribute (color) for each class ;0=Grey, 1=Red, 2=Blue, 3=Green, 4=Purple, 5=Yellow, 6=Brown/Orange, 7=Fuscia ;+8=can walk over ;+16=can shoot over ;+32=attackable ;bg tiles ; 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 DB 0 ; 0 DB 0, 0, 0, 4, 2, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 1- 20 DB 0, 3, 3, 3, 3, 3,34,34,34,34,34,34,34,34,34,34,34,34,34,34 ; 21- 40 DB 34,34,34,34,34,34,34,34,34,34, 1, 1, 1, 1, 2, 2, 2, 2, 6, 6 ; 41- 60 DB 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ; 61- 80 DB 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 81-100 DB 0, 0, 0, 0, 0,38,38,38,38, 2,36,36,36,36,36,36,36,36,36,36 ;101-120 DB 36,36,39, 6, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 4, 4, 4, 4, 5 ;121-140 DB 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ;141-160 DB 2, 2, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;161-180 DB 0, 0, 0, 6, 4, 1, 5, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ;181-200 DB 4, 4, 4, 4, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ;201-220 DB 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ;221-240 DB 3, 3, 3, 3, 3, 3, 0,16, 0, 6, 6, 3, 3, 3, 3, 0,37,37,37,37 ;241-260 DB 37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37 ;261-280 DB 37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37 ;281-300 DB 37,37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;301-320 DB 0, 0,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18 ;321-340 DB 18,18, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;341-360 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3 ;361-380 DB 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0 ;381-400 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6 ;401-420 DB 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 5, 5, 5, 5 ;421-440 DB 5, 5, 5, 6,18,18,18,18,18,18,18,18,18,18,18,18, 0, 0, 0,18 ;441-460 ;water DB 18,18,18,22,22,22,22,22,22,22,22,22,22,22,22,22,22, 7, 4, 4 ;461-480 ;bank DB 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 3, 3 ;481-500 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3 ;501-520 DB 3, 3, 3, 3, 3, 3, 3, 3, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2 ;521-540 DB 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2 ;541-560 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;561-580 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;581-600 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 ;601 DB 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 ;621 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;641 DB 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ;661 DB 4, 4, 4, 6, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 3 ;681 DB 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3 ;701 DB 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1 ;721 DB 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;741 DB 1, 1, 1, 1, 1, 1, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ;761 DB 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ;781 DB 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ;801 DB 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ;821 DB 6, 6, 6, 6, 6,38, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,38, 6, 0 ;841 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6 ;861 DB 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,32, 0, 3, 3, 3, 3,35, 3, 5, 5 ;881 DB 5, 5,37, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6 ;901 DB 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3 ;921 DB 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;941 DB 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5,37, 5, 1, 1, 1, 1 ;961 DB 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;981 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1001 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1021 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1041 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,34,34,34,34, 2, 2, 2, 2 ;1061 DB 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ;1081 DB 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,24,24,24,24 ;1101 DB 24,24,24,24,24,24,24,24,24,24,24,24, 0, 0, 0, 2, 2, 0, 0, 0 ;1121 ; 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ;0=Grey, 1=Red, 2=Blue, 3=Green, 4=Purple, 5=Yellow, 6=Brown/Orange, 7=Fuscia DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32 ;1141 DB 32, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1161 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1181 DB 3, 6, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ;1201 DB 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3 ;1221 DB 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4 ;1241 DB 4,32,32,32,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 6, 0 ;1261 DB 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 0,32,32, 0, 0, 0, 0, 0, 0, 0 ;1281 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1301 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2 ;1321 DB 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 5, 2, 2, 3 ;1341 DB 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 6, 5, 5, 3, 3, 3, 2, 2, 2, 2 ;1361 DB 2, 2, 2, 0, 0, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1381 DB 0,35,35,35,35,35, 8, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1401 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1421 DB 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 5, 6, 6 ;1441 DB 1, 3, 2,33,33,33,33,34,34,34,34,38,38,38,38,32,32,32,32,32 ;1461 DB 32,32,32,32,32,32,32,32,32,33,33,33,33,35,35,35,35,35,35,35 ;1481 DB 35,35,35,35,35,35,35,35,35,35,35,29,37,37,37,37,37,37,37,37 ;1501 DB 37,37,37,37,37,37,37,37,37,37,37,37,16,25,25,25,29,30,32,32 ;1521 DB 32,32,32,32,32,32, 4, 4, 4, 4,53,53,53,53,53,53,53,53,53,53 ;1541 DB 53,53,53,53,53,53,53,53, 0, 0, 0,30,29, 2, 2, 2, 2, 2, 2, 2 ;1561 DB 2, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ;1581 DB 6, 6, 6, 6, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0 ;1601 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1621 DB 0, 0,32,32,32,32,32,32,32,32,32,30, 6, 6, 6, 6, 6, 6, 6, 6 ;1641 DB 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0 ;1661 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2 ;1681 DB 2, 2, 2, 0, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ;1701 DB 6, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6 ;1721 DB 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0 ;1741 DB 0, 3, 3, 3, 0,32,32,32,32,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1761 DB 0,32,32, 0, 0,32,32, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ;1781 DB 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 ;1801 DB 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ;1821 DB 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,33, 1,34, 2,33,33 ;1841 DB 1, 1,34,34, 2, 2,33,33, 1, 1,34,34, 2, 2, 6, 0, 0, 0, 0,24 ;1861 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1881 DB 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1901 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1921 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1941 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1961 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;1981 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;2001 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5 ;2021 DB 0, 0,25, 0, 0, 5, 1 ;2041 ; 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ;0=Grey, 1=Red, 2=Blue, 3=Green, 4=Purple, 5=Yellow, 6=Brown/Orange, 7=Fuscia ;+8=can walk over ;+16=can shoot over ;+32=attackable SECTION "FGTileSection",ROMX[$4800] FGTiles: INCBIN "Data/Tiles/fgTiles2048-2302.bin" ;monsta tiles INCBIN "Data/Tiles/fgTiles2304-2559.bin" ;monsta tiles fg_colorTable:: ;defines a byte for the tile attribute (color) for each class ;0=Grey, 1=Red, 2=Blue, 3=Green, 4=Purple, 5=Yellow, 6=Brown/Orange, 7=Fuscia ; + any combination of: ;16 = is bullet ;32 = 2x2 monster ;64 = no rotate when facing N/S ;128 = can't be thrown (probably stationary) ;obj tiles ; +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 ; 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 DB 4, 4, 2, 2, 5, 5, 1, 1, 2, 2, 3, 3, 3, 3,64, 2, 2, 6, 6,64 ;2048 +0 DB 0,133,5, 0, 0, 0, 0, 0, 0, 1, 0, 6, 6, 4, 0, 4, 0, 5, 5, 5 ;2068 +20 DB 5,195,195,0,0,65,65, 6, 6,70,70,67, 0, 0,35,35,35,35,35,35 ;2088 +40 DB 0, 0, 0, 0, 2, 2, 5, 5, 6, 6, 0, 0,38,38,38,38,38,38,38,38 ;2108 +60 DB 6, 6,16,16,16,16,16,16, 3, 3, 0, 0,165,165,165,165,2,2,1,1 ;2128 +80 DB 4, 0, 0, 0, 2, 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5 ;2148 +100 DB 166,0, 0, 0, 0, 0,70,70,70,70,64,64,65,65,66,66,35,35,35,35 ;2168 +120 DB 35,35, 0, 0, 6, 6, 6, 6,66,66,70,70, 6, 6,16,16, 6, 6,16,16 ;2188 +140 DB 0, 0,16,16,16,16,16,16,16,16,16,16, 6, 6,38,38,38,38,38,38 ;2208 +160 DB 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37 ;2228 +180 DB 37,37,37,37,37,37, 3, 3, 5, 5,33,33,33,33,33,33,33,33, 1, 1 ;2248 +200 DB 34,34,34,34,34,34,34,34, 5, 5, 4, 4, 0, 0, 5, 5, 5, 5, 0, 0 ;2268 +220 DB 3, 3, 1, 1, 4, 4,16,16,34,34,34,34,19,19, 0, 0,64,64,65,65 ;2288 +240 DB 3, 3, 5, 5, 0, 0, 0, 6, 6,21,21,38,38,38,38,38,38,38,38, 3 ;2308 +260 DB 3, 7, 7, 5, 6, 6, 6,37, 5, 5, 5,37, 5, 5, 5,163,3, 3, 3, 6 ;2328 +280 DB 6, 6, 6,35, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,32, 0, 0, 0, 0, 0 ;2348 +300 DB 0, 0,32, 0, 0, 0,38, 0, 0, 0, 0, 0, 0, 0,16, 0, 1, 0, 2, 0 ;2368 +320 DB 3, 0,35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,70, 0, 0, 0, 0, 0 ;2388 +340 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;2408 +360 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;2428 +380 DB 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 5, 0, 1, 0, 0, 0, 0, 0 ;2448 +400 DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;2468 +420 ; +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 ; 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 ;--------------------------------------------------------------------- SECTION "MapBGPix",ROMX ;--------------------------------------------------------------------- waitingToJoin_bg: INCBIN "../fgbpix/menu/waitingToJoin.bg"