static int mm_handleBallState(sim_tBallStatus *ball, int *inports) { switch (ball->state) { /* Hit Trolls */ case stLTroll: if(core_getSw(swLTrollUp)) return setState(stLTroll2,0); else return setState(stFree,0); case stRTroll: if(core_getSw(swRTrollUp)) return setState(stRTroll2,0); else return setState(stFree,0); /* Hit the Castle */ case stCastle: if(core_getSw(swDBUp)) return setState(stCastleMoat,0); else if (core_getSol(sCastleGateH)) return setState(stEnterCastle,0); else return setState(stHitCastle,0); /* Tower Lock (has to be here, works inverted) */ case stTowerLock: if(!core_getSol(sTowerLockPost)) return setState(stFree,0); } return 0; }
static void br_handleMech(int mech) { /* -------------------------------------- -- Get Up and Down the Ship's Ramp -- -------------------------------------- */ if (mech & 0x01) { /*-- if Ramp is Up and the RampDown Solenoid is firing, Lower it --*/ if (core_getSol(sRampDown)) locals.shiprampPos = 1 ; /*-- if Ramp is Down and the RampUp Solenoid is firing, raise it --*/ if (core_getSol(sRampUp)) locals.shiprampPos = 0 ; /*-- Make sure RampUpDown Switch is on, when ramp is Up --*/ core_setSw(swRampDown,locals.shiprampPos); } /* -------------------------------------------------------------------- -- Handle the Cannon to change its position and go back and forth -- -------------------------------------------------------------------- */ if (mech & 0x02) { if (locals.cannonPos == 0) core_setSw(swCannonDir,0); if (locals.cannonPos == 300) core_setSw(swCannonDir,1); if (core_getSol(sCannonMotor) && !core_getSw(swCannonDir)) locals.cannonPos++; if (core_getSol(sCannonMotor) && core_getSw(swCannonDir)) locals.cannonPos--; } }
/*-------------------- / Drawing information /---------------------*/ static void wcs_drawMech(BMTYPE **line) { static const char *goalie[] = {" * ", "* ", " *"}; static const char ball[] = {'|','/','-','\\'}; core_textOutf(50, 0,BLACK,"Goalie: [%s]", goalie[core_getSw(swGoalieL) ? 1 : (core_getSw(swGoalieR) ? 2 : 0)]); core_textOutf(50,10,BLACK,"Ball: %c %3d ", ball[mech_getPos(1)], mech_getSpeed(1)); }
/*--------------------------------- Display Status of the DrawBridge ----------------------------------*/ static const char* showdrawbridgePos(void) { if(core_getSw(swDBUp) && !core_getSol(sDBMotor)) return "Up "; if(core_getSw(swDBDown) && !core_getSol(sDBMotor)) return "Down "; if(core_getSol(sDBMotor) && locals.drawbridgePos < 50) return "Moving Down....."; if(core_getSol(sDBMotor) && locals.drawbridgePos < 100) return "Moving Down.... "; if(core_getSol(sDBMotor) && locals.drawbridgePos < 150) return "Moving Down... "; if(core_getSol(sDBMotor) && locals.drawbridgePos < 200) return "Moving Down.. "; if(core_getSol(sDBMotor) && locals.drawbridgePos < 250) return "Moving Down. "; if(core_getSol(sDBMotor) && locals.drawbridgePos < 300) return "Moving Up. "; if(core_getSol(sDBMotor) && locals.drawbridgePos < 350) return "Moving Up.. "; if(core_getSol(sDBMotor) && locals.drawbridgePos < 400) return "Moving Up... "; if(core_getSol(sDBMotor) && locals.drawbridgePos < 450) return "Moving Up.... "; if(core_getSol(sDBMotor) && locals.drawbridgePos < 500) return "Moving Up..... "; return "Unknown "; }
/* The drop target and hole behind can only be reached if the bank is down */ static int afm_keyCond(int cond, int ballState, int *inports) { switch (cond) { case AFM_DROPCOND: /* ball on PF & bank down & drop up */ return (ballState == stFree) && core_getSw(swMBankDn) && !core_getSw(swDrop); case AFM_CTCOND: /* ball on PF & bank down & drop down */ return (ballState == stFree) && core_getSw(swMBankDn) && core_getSw(swDrop); } return FALSE; }
static void jd_handleMech(int mech) { /*Spin Globe*/ if (mech & 0x01) { if (core_getSol(sGlobeMotor)) locals.globePos++; if (locals.globePos>100) locals.globePos=0; /*Ball ok to lift switch set when in desired position*/ core_setSw(swGlobe2,(locals.globePos>=0 && locals.globePos<=10)); } /*Move Arm*/ if (mech & 0x02) { if (core_getSol(sGlobeArm)) locals.armPos++; if (locals.armPos>100) locals.armPos=0; /*ARM FAR RIGHT is set when at desired position*/ core_setSw(swArmFR,(locals.armPos>=0 && locals.armPos<=10)); } /*Handle Drop Targets*/ /*WPCMAME: I don't get this. Why do we need all this drop target handling? */ //Drop Target Solenoid Raises ALL 5 DTS*/ if (mech & 0x04) { if (core_getSol(sDropTarget)) locals.jdtPos = locals.udtPos = locals.ddtPos = locals.gdtPos = locals.edtPos = DT_UP; else { /*Switch hit pops the target down!*/ if (locals.jdtPos == DT_UP && core_getSw(sw_Judge)) locals.jdtPos = DT_DOWN; if (locals.udtPos == DT_UP && core_getSw(swJ_udge)) locals.udtPos = DT_DOWN; if (locals.ddtPos == DT_UP && core_getSw(swJu_dge)) locals.ddtPos = DT_DOWN; if (locals.gdtPos == DT_UP && core_getSw(swJud_ge)) locals.gdtPos = DT_DOWN; if (locals.edtPos == DT_UP && core_getSw(swJudg_e)) locals.edtPos = DT_DOWN; } /*If TripDrop Pull D Back Down! */ if (core_getSol(sTripDropTarget)) locals.ddtPos = DT_DOWN; /*All drop target switches must be on, while target is down!*/ core_setSw(sw_Judge,locals.jdtPos == DT_DOWN); core_setSw(swJ_udge,locals.udtPos == DT_DOWN); core_setSw(swJu_dge,locals.ddtPos == DT_DOWN); core_setSw(swJud_ge,locals.gdtPos == DT_DOWN); core_setSw(swJudg_e,locals.edtPos == DT_DOWN); } }
static void s11_irqline(int state) { if (state) { cpu_set_irq_line(0, M6808_IRQ_LINE, ASSERT_LINE); /*Set coin door inputs, differs between S11 & DE*/ if (locals.deGame) { pia_set_input_ca1(S11_PIA2, !core_getSw(DE_SWADVANCE)); pia_set_input_cb1(S11_PIA2, core_getSw(DE_SWUPDN)); } else { pia_set_input_ca1(S11_PIA2, core_getSw(S11_SWADVANCE)); pia_set_input_cb1(S11_PIA2, core_getSw(S11_SWUPDN)); } } else if (!locals.piaIrq) { cpu_set_irq_line(0, M6808_IRQ_LINE, CLEAR_LINE); pia_set_input_ca1(S11_PIA2, locals.deGame); pia_set_input_cb1(S11_PIA2, locals.deGame); } }
static void rs_drawMech(BMTYPE **line) { // core_textOutf(30, 0,BLACK,"Ted's /Red's Mouth:"); // core_textOutf(30, 10,BLACK,"%-6s/%-6s", locals.tedmouthPos?"Open":"Closed", locals.redmouthPos?"Closed":"Open"); // core_textOutf(30, 20,BLACK,"Ted's /Red's Eyes:"); // core_textOutf(30, 30,BLACK,"%-8s/%-8s", showtedeyepos(), showredeyepos()); // core_textOutf(30, 40,BLACK,"Bulldozer: %-6s", core_getSw(swDozerDown)?"Closed":"Open"); core_textOutf(30, 0,BLACK,"Ted/Red's Mouth, Eyes:"); core_textOutf(30, 10,BLACK,"%-8s/%-6s,", locals.tedmouthPos?"Open":"Closed", locals.redmouthPos?"Closed":"Open"); core_textOutf(30, 20,BLACK,"%-8s/%-8s", showtedeyepos(), showredeyepos()); core_textOutf(30, 30,BLACK,"Bulldozer: %-6s", core_getSw(swDozerDown)?"Closed":"Open"); }
static int br_handleBallState(sim_tBallStatus *ball, int *inports) { switch (ball->state) { /* Ball in Shooter Lane */ case stBallLane: if (ball->speed < 7) return setState(stNotEnough,7); /*Ball not plunged hard enough*/ if (ball->speed < 20) return setState(stFree,20); /*Ball doesn't touch anything*/ if (ball->speed < 25) return setState(stBotBot,25); /*Ball touched Bot.Bot. Target*/ if (ball->speed < 35) return setState(stBotMid,35); /*Ball touched Bot.Mid. Target*/ if (ball->speed < 45) return setState(stBotTop,45); /*Ball touched Bot.Top. Target*/ if (ball->speed < 51) return setState(stShipRamp,51); /*Ball gets the Ship Ramp*/ break; /*----------------- Ship's Ramp -------------------*/ case stShipRamp: /* If the ramp is Down... Go up the Creature Ramp!*/ /* Otherwise go normally through the Left Ramp. */ if (core_getSw(swRampDown)) return setState(stEnterShipRamp,5); else return setState(stLoadCannon,5); break; /*----------------------------------- Cannon - Where will the ball land? -------------------------------------*/ case stCannonFired: if (locals.cannonPos >= 0 && locals.cannonPos <= 50) return setState(stEnterLock,30); if (locals.cannonPos >= 51 && locals.cannonPos <= 100) return setState(stEnterLRamp,30); if (locals.cannonPos >= 101 && locals.cannonPos <= 150) return setState(stBroadside,30); if (locals.cannonPos >= 151 && locals.cannonPos <= 200) return setState(stEnterRRamp,30); if (locals.cannonPos >= 201 && locals.cannonPos <= 250) return setState(stJetsLoop,30); if (locals.cannonPos >= 251 && locals.cannonPos <= 300) return setState(stFree,30); } return 0; }
static INTERRUPT_GEN(s11_vblank) { /*------------------------------- / copy local data to interface /--------------------------------*/ locals.vblankCount += 1; /*-- lamps --*/ if ((locals.vblankCount % S11_LAMPSMOOTH) == 0) { memcpy(coreGlobals.lampMatrix, coreGlobals.tmpLampMatrix, sizeof(coreGlobals.tmpLampMatrix)); memset(coreGlobals.tmpLampMatrix, 0, sizeof(coreGlobals.tmpLampMatrix)); } /*-- solenoids --*/ if (locals.ssEn) { // set gameon and special solenoids int ii; locals.solenoids |= CORE_SOLBIT(S11_GAMEONSOL); /*-- special solenoids updated based on switches --*/ for (ii = 0; ii < 6; ii++) { if (core_gameData->sxx.ssSw[ii] && core_getSw(core_gameData->sxx.ssSw[ii])) locals.solenoids |= CORE_SOLBIT(CORE_FIRSTSSSOL+ii); } } #ifdef FIXMUX // mux translation moved #else if ((core_gameData->sxx.muxSol) && (locals.solenoids & CORE_SOLBIT(core_gameData->sxx.muxSol))) { if (core_gameData->hw.gameSpecific1 & S11_RKMUX) locals.solenoids = (locals.solenoids & 0x00ff8fef) | ((locals.solenoids & 0x00000010)<<20) | ((locals.solenoids & 0x00007000)<<13); else locals.solenoids = (locals.solenoids & 0x00ffff00) | (locals.solenoids<<24); } #endif locals.solsmooth[locals.vblankCount % S11_SOLSMOOTH] = locals.solenoids; #if S11_SOLSMOOTH != 2 # error "Need to update smooth formula" #endif coreGlobals.solenoids = locals.solsmooth[0] | locals.solsmooth[1]; coreGlobals.solenoids2 = locals.extSol << 8; locals.solenoids = coreGlobals.pulsedSolState; locals.extSol = locals.extSolPulse; /*-- display --*/ if ((locals.vblankCount % S11_DISPLAYSMOOTH) == 0) { memcpy(coreGlobals.segments, locals.segments, sizeof(coreGlobals.segments)); memcpy(locals.segments, locals.pseg, sizeof(locals.segments)); coreGlobals.diagnosticLed = locals.diagnosticLed; locals.diagnosticLed = 0; } core_updateSw(locals.ssEn); }
static int gi_handleBallState(sim_tBallStatus *ball, int *inports) { switch (ball->state) { /* Ball in Shooter Lane */ case stBallLane: if (ball->speed < 25) return setState(stNotEnough,25); /*Ball not plunged hard enough*/ if (ball->speed < 40) return setState(stTopEject,40); /*Ball fall into Top-KickOut*/ if (ball->speed < 51) return setState(stTopRightLane,51); /*Ball rolled down Right Top Lane*/ /*----------------- Island Ramp -------------------*/ case stRamp: /* If the ramp is Down, go up the Jungle*/ /* Otherwise go normally down-ramp */ if (core_getSw(swRampStatus)) return setState(stUpRamp,5); else return setState(stDownRamp,5); break; /*----------------- Where in Jungle? -------------------*/ case stUpRamp: if (locals.junglePos == 1) return setState(stTopRampHole,5); if (locals.junglePos == 2) return setState(stPBotRite,5); if (locals.junglePos == 3) return setState(stPTopRite,5); if (locals.junglePos == 4) return setState(stPTopLeft,5); if (locals.junglePos == 5) return setState(stPBotLeft,5); } return 0; }
static int cftbl_handleBallState(sim_tBallStatus *ball, int *inports) { switch (ball->state) { /* Ball in Shooter Lane */ case stBallLane: if (ball->speed < 15) return setState(stNotEnough,15); /*Ball not plunged hard enough*/ if (ball->speed < 22) return setState(stpaiD,22); /*Ball rolled down 'D' Letter*/ if (ball->speed < 29) return setState(stpaId,29); /*Ball rolled down 'I' Letter*/ if (ball->speed < 36) return setState(stpAid,36); /*Ball rolled down 'A' Letter*/ if (ball->speed < 43) return setState(stPaid,43); /*Ball rolled down 'P' Letter*/ if (ball->speed < 51) return setState(stDownFromLeft,51); /*Ball rolled down from left*/ break; /*----------------- Creature Ramp -------------------*/ /* This time I'm gonna give a little help on this part... If you look at the state array you'll find that this state has all 0s, you must create this state for using it as a hook. Jump your Keyboard Definitions here in case you want to decide something, in this case the RampUp/Down state is decided. If you jump to a normal state (ie without 0s), this part will not be used so be careful :) */ case stLRamp: /* If the ramp is Down... Go up the Creature Ramp!*/ /* Otherwise go normally through the Left Ramp. */ if (core_getSw(swRampUpDown)) return setState(stCreatureRamp,5); else return setState(stEnterLeftRamp,5); break; } return 0; }
static int rs_handleBallState(sim_tBallStatus *ball, int *inports) { switch (ball->state) { /* Ball in Right Shooter Lane */ case stBallLane: if (ball->speed < 10) return setState(stNotEnough,10); /*Ball not plunged hard enough*/ if (ball->speed < 20) return setState(stSkillUp,20); /*Ball comes down from the right*/ if (ball->speed < 30) return setState(stSkillShot,25); /*Ball entered Skill Shot hole*/ if (ball->speed < 40) return setState(stRightLane2,35); /*Ball goes to the Jets*/ if (ball->speed < 51) return setState(stRightLane3,51); /*Ball hits Bulldozer*/ break; /* Ball in Left Shooter Lane */ case stLBallLane: if (ball->speed < 15) return setState(stNoStrength,30); /*Ball not plunged hard enough*/ if (ball->speed < 25) return setState(st5XBlast,50); /*Ball landed in 5X Blast Hole*/ if (ball->speed < 35) return setState(stRRiot,70); /*Ball landed in Radio Riot Hole*/ if (ball->speed < 45) return setState(stEB,70); /*Ball landed in Extra Ball Lit Hole*/ if (ball->speed < 51) return setState(stHelmet,70); /*Ball Hits the Ted's Helmet*/ break; /* Red Hit */ case stHitRed: /*Is Red's Mouth Open?*/ if (locals.redmouthPos) return setState(stRedMouth,10); /*Ball hits Red's Jaw*/ else return setState(stRedGulp,10); /*Ball goes into Red's mouth*/ break; /* Bulldozer */ case stBulldozer: /*Is the Bulldozer Open?*/ if (core_getSw(swDozerDown)) return setState(stDozerHit,10); else return setState(stHitTed,10); /* Ted Hit */ case stHitTed: /*Is Ted's Mouth Open?*/ if (!locals.tedmouthPos) return setState(stTedMouth,10); /*Ball hits Ted's Jaw*/ else return setState(stTedGulp,10); /*Ball goes into Ted's mouth*/ break; /* Left Inlane - StFree or Go to Left Shooter? */ case stLeftInlane2: if (locals.frgatePos) { ball->speed = -1; return setState(stLShooter,5); } else return setState(stLeftInlane,5); break; } return 0; }
static int drac_handleBallState(sim_tBallStatus *ball, int *inports) { switch (ball->state) { /*----------------- Coffin Ramp -------------------*/ case stRRamp: /* If the ramp is Down, go up the Coffin Ramp else fall down into the Coffin Hole */ if (core_getSw(swRRampUp)) return setState(stCoffinPopper,5); else return setState(stRRampMade,20); break; /*----------------- Castle Ramp -------------------*/ case stLRamp: /* If the ramp diverter is off, go through the Left Ramp otherwise send the ball into Castle Locks */ if (core_getSw(swDiverter)) return setState(stLRampDivMade,5); else return setState(stLRampMade,5); break; /*----------------- Shooter Ramp -------------------*/ case stBallLane: /* If the Shooter ramp is down, go to the Left Loop else go to the Right Gate */ if (core_getSol(sShooterRamp)) return setState(stUnderShootRamp,5); else return setState(stLeftLoop,5); break; /*----------------- Drop Target -------------------*/ case stLDrop: /* If the Drop Target is down, pass through it into VM hole, else lower it */ if (core_getSw(swLDrop)) return setState(stLDropScore,5); else return setState(stLDrop2,5); break; /*------------- Mist Magnet --------------*/ case stMagnet: /* The BallOnMagnet switch must be always 1, except when there is no ball on the left/right gates */ core_setSw(swBallOnMagnet,1); /* If the Magnet is on the right AND active AND the motor position counts to 0, go to the Left Gate */ if (core_getSw(swMagnetRight) && core_getSol(sMagnet) && locals.magnetPos == 0) return setState(stLGate,0); /* If the Magnet is on the left AND active AND the motor position counts to 500, go to the Right Gate */ if (core_getSw(swMagnetLeft) && core_getSol(sMagnet) && locals.magnetPos == 500) return setState(stRGate,0); /* If the Magnet is off OR the fake switch activated by enter is on, get out of the magnet's area */ if (!core_getSol(sMagnet) || core_getSw(swExitMagnet)) { core_setSw(swBallOnMagnet,0); return setState(stFree,0); } break; } return 0; }
static void drac_drawMech(BMTYPE **line) { core_textOutf(30, 10,BLACK,"Shooter Ramp : %-6s", core_getSol(sShooterRamp) ? "Up":"Down"); core_textOutf(30, 20,BLACK,"Coffin Ramp : %-6s", core_getSw(swRRampUp) ? "Up":"Down"); core_textOutf(30, 30,BLACK,"Drop Target : %-6s", core_getSw(swLDrop) ? "Down":"Up"); // core_textOutf(30, 40,BLACK,"Ramp Diverter: %-6s", core_getSw(swDiverter) ? "On":"Off"); }
/*-------------------- Drawing information --------------------*/ static void br_drawMech(BMTYPE **line) { core_textOutf(30, 10,BLACK,"Ship Ramp : %-4s", core_getSw(swRampDown) ? "Down":"Up"); core_textOutf(30, 20,BLACK,"Cannon Pointing to:"); core_textOutf(30, 30,BLACK,"%-11s (%3d)", showcannonpos(), locals.cannonPos); }
static void drac_handleMech(int mech) { /* --------------------------------- -- Raise/Lower the Coffin Ramp -- --------------------------------- */ if (mech & 0x01) { /*-- if Ramp is up and the RampDown Solenoid is firing, lower it --*/ if (core_getSol(sRRampDown)) locals.coffinrampPos = 0 ; /*-- if Ramp is down and the RampUp Solenoid is firing, raise it --*/ if (core_getSol(sRRampUp)) locals.coffinrampPos = 1 ; /*-- Make sure RampUp Switch is on, when the ramp is up --*/ core_setSw(swRRampUp,locals.coffinrampPos); } /* --------------------------- -- Raise the Drop Target -- --------------------------- */ if ((mech & 0x02) && core_getSol(sLDrop)) core_setSw(swLDrop,0); /* ----------------- -- Mist Magnet -- ----------------- */ if (mech & 0x04) { /* Set switches according to position */ if (locals.magnetPos == 0) { core_setSw(swMagnetLeft,1); core_setSw(swMagnetRight,0); } if (locals.magnetPos == 500) { core_setSw(swMagnetRight,1); core_setSw(swMagnetLeft,0); } /* If the magnet is on the left and the motor is on, increase position */ if (core_getSw(swMagnetLeft) && core_getSol(sMagnetMotor)) locals.magnetPos++; /* If the magnet is on the right and the motor is on, decrease position */ if (core_getSw(swMagnetRight) && core_getSol(sMagnetMotor)) locals.magnetPos--; } /* ---------------------------------------------------------------------- -- Ramp Diverter (Needs to be tricked because it doesn't like to be -- -- pressed for the necessary time needed to complete the ramp shot) -- ---------------------------------------------------------------------- */ if (mech & 0x08) { /* If the diverter fires, increase diverter's time, when it is < 20 set a fake diverter switch to 1 */ if (core_getSol(sTopDiverter)) { locals.diverterTime++; if (locals.diverterTime < 20) core_setSw(swDiverter,1); } /* If any of these switches are pressed, reset the diverter's timer and set the fake diverter switch to 0 */ if (core_getSw(swLRampDivMade) || core_getSw(swCastle3) || core_getSw(swCastle2) || core_getSw(swCastle3) || core_getSw(swShooter)) { locals.diverterTime = 0; core_setSw(swDiverter,0); } } }
/*-------------------- Drawing information --------------------*/ static void cftbl_drawMech(BMTYPE **line) { core_textOutf(30, 10,BLACK,"Creature Ramp: %-6s", core_getSw(swRampUpDown) ? "Down":"Up"); }
static void gi_handleMech(int mech) { /* -------------------------------------- -- Get Up and Down the Jungle Ramp -- -------------------------------------- */ if (mech & 0x01) { /*-- if Ramp is Up and the RampDown Solenoid is firing, Lower it --*/ if (core_getSol(sRampDown)) locals.junglerampPos = 1 ; /*-- if Ramp is Down and the RampUp Solenoid is firing, raise it --*/ if (core_getSol(sRampUp)) locals.junglerampPos = 0 ; /*-- Make sure RampStatus Switch is off, when ramp is Up --*/ core_setSw(swRampStatus,locals.junglerampPos); } /* Now here we handle the Jungle */ if (mech & 0x02) { /* If the Jungle Motor is spinning, increase Jungle Time */ if (core_getSol(sJungleMotor) && !core_getSol(sIslandLock)) { core_setSw(swFakeIslandPos,1); locals.jungleTime++; } /* Set switches according to position */ if (locals.jungleTime >= 0 && locals.jungleTime <= 12) { core_setSw(swWheelOpto,0); core_setSw(swWheelLock,0); locals.junglePos = 5; } else if (locals.jungleTime >= 12 && locals.jungleTime <= 49) { core_setSw(swWheelOpto,1); core_setSw(swWheelLock,1); } /* Same that before from now on, but on different positions */ if (locals.jungleTime >= 50 && locals.jungleTime <= 62) { core_setSw(swWheelOpto,0); core_setSw(swWheelLock,0); locals.junglePos = 1; } else if (locals.jungleTime >= 63 && locals.jungleTime <= 99) { core_setSw(swWheelOpto,1); core_setSw(swWheelLock,1); } if (locals.jungleTime >= 100 && locals.jungleTime <= 112) { core_setSw(swWheelOpto,0); core_setSw(swWheelLock,0); locals.junglePos = 2; } else if (locals.jungleTime >= 113 && locals.jungleTime <= 149) { core_setSw(swWheelOpto,1); core_setSw(swWheelLock,1); } if (locals.jungleTime >= 150 && locals.jungleTime <= 162) { core_setSw(swWheelOpto,0); core_setSw(swWheelLock,0); locals.junglePos = 3; } else if (locals.jungleTime >= 163 && locals.jungleTime <= 199) { core_setSw(swWheelOpto,1); core_setSw(swWheelLock,1); } if (locals.jungleTime >= 200 && locals.jungleTime <= 212) { core_setSw(swWheelOpto,0); core_setSw(swWheelLock,0); locals.junglePos = 4; } else if (locals.jungleTime >= 213 && locals.jungleTime <= 249) { core_setSw(swWheelOpto,1); core_setSw(swWheelLock,1); } if (locals.jungleTime == 250) locals.jungleTime = 0; /* If the emulation resets (F3), sync the island position */ if (!core_getSw(swFakeIslandPos)) { locals.junglePos = 5; locals.jungleTime = 0; } } }
static void gi_drawMech(BMTYPE **line) { core_textOutf(30, 10,BLACK,"Ramp Status : %-4s", core_getSw(swRampStatus) ? "Down":"Up"); core_textOutf(30, 20,BLACK,"Jungle Position: %d", locals.junglePos); /* Help */ }
/*-------------------- / Drawing information /---------------------*/ static void afm_drawMech(BMTYPE **line) { core_textOutf(50, 0,BLACK,"Bank: %-4s", core_getSw(swMBankUp) ? "Up" : (core_getSw(swMBankDn) ? "Down" : "")); core_textOutf(50,10,BLACK,"Drop: %-4s", core_getSw(swDrop) ? "Down" : "Up"); }
static void rs_handleMech(int mech) { /* ------------------------------ -- Open & Close Ted's Mouth -- ------------------------------ */ if (mech & 0x01) { /* -- If open, and Mouth Solenoid fired and !UpDown fired - Close it! -- */ if (locals.tedmouthPos && core_getSol(sTedMouthMotor) && !core_getSol(sTedMotorDrv)) locals.tedmouthPos = 0; /* -- If closed, and Mouth Solenoid fired and UpDown fired - Open it! -- */ if (!locals.tedmouthPos && core_getSol(sTedMouthMotor) && core_getSol(sTedMotorDrv)) locals.tedmouthPos = 1; } /* ------------------------------ -- Open & Close Red's Mouth -- ------------------------------ */ if (mech & 0x02) { /* -- If open, and Mouth Solenoid fired and !UpDown fired - Close it! -- */ if (locals.redmouthPos && core_getSol(sRedMouthMotor) && !core_getSol(sRedMotorDrv)) locals.redmouthPos = 0; /* -- If closed, and Mouth Solenoid fired and UpDown fired - Open it! -- */ if (!locals.redmouthPos && core_getSol(sRedMouthMotor) && core_getSol(sRedMotorDrv)) locals.redmouthPos = 1; } /* ------------------------------- -- Open & Close Bulldozer -- ------------------------------- */ if (mech & 0x04) { if (core_getSol(sBulldozer)) locals.bulldozerPos = (locals.bulldozerPos + 1) % BULLDOZER_TICKS; core_setSw(swDozerUp, locals.bulldozerPos < 15); core_setSw(swDozerDown, (locals.bulldozerPos >= (BULLDOZER_TICKS/2)) && (locals.bulldozerPos < (BULLDOZER_TICKS/2+15))); } /* ------------------------------------ -- Open & Close Flying Rocks Gate -- ------------------------------------ */ /* -- If the Lower Left Solenoid fires, open it till the Left Shooter Switch is pressed --*/ if (mech & 0x08) { if (core_getSol(sLLDiverter)) locals.frgatePos = 1; if (core_getSw(swLShooter)) locals.frgatePos = 0; } /* ---------------------------------- -- Update status of Ted's Eyes -- ---------------------------------- */ if (mech & 0x10) { /* -- If Eyes are Open, and Closed Solenoid Fired, close them! --*/ if (locals.tedeyesOC == 0 && core_getSol(sTedLidsDown)) locals.tedeyesOC = 1; /* - If Eyes are Closed, and Open Solenoid Fired, open them! -*/ if (locals.tedeyesOC == 1 && core_getSol(sTedLidsUp)) locals.tedeyesOC = 0; } /* -- Now check position of Eyes -- */ if (mech & 0x20) { if (core_getSol(sTedEyesLeft)) locals.tedeyesLR = TEYES_LEFT; else if (core_getSol(sTedEyesRight)) locals.tedeyesLR = TEYES_RIGHT; else locals.tedeyesLR = TEYES_ST; } /* ---------------------------------- -- Update status of Red's Eyes -- ---------------------------------- */ if (mech & 0x40) { /* -- If Eyes are Open, and Closed Solenoid Fired, close them! --*/ if (locals.redeyesOC == 0 && core_getSol(sRedLidsDown)) locals.redeyesOC = 1; /* -- If Eyes are Closed, and Open Solenoid Fired, open them! -- */ if (locals.redeyesOC == 1 && core_getSol(sRedLidsUp)) locals.redeyesOC = 0; } if (mech & 0x80) { /* -- Now check position of Eyes -- */ if (core_getSol(sRedEyesLeft)) locals.redeyesLR = REYES_LEFT; else if (core_getSol(sRedEyesRight)) locals.redeyesLR = REYES_RIGHT; else locals.redeyesLR = REYES_ST; } }
static READ_HANDLER(riot_porta_r) { int sw = core_getSw(1 + locals.swStrobe) ? 0 : 1; return locals.swStrobe | (locals.inhibitNmi << 5) | (sw << 6) | ((coreGlobals.swMatrix[0] & 1) << 7); }