Hooks
static bool BeforeCvCity_CreateProject(CvCity* self, ProjectTypes eProjectType, bool& result);static void AfterCvCity_CreateProject(CvCity* self, ProjectTypes eProjectType, bool& result);static bool ReplaceCvCity_CreateProject(bool (*original)(CvCity*, ProjectTypes), CvCity* self, ProjectTypes eProjectType);CivRegisterBefore<CivHooks::CvCity_CreateProject>(host, &BeforeCvCity_CreateProject);CivRegisterAfter<CivHooks::CvCity_CreateProject>(host, &AfterCvCity_CreateProject);CivRegisterReplace<CivHooks::CvCity_CreateProject>(host, &ReplaceCvCity_CreateProject);
Code
13696bool CvCity::CreateProject(ProjectTypes eProjectType)13697{13698 VALIDATE_OBJECT1369913700 CvPlayer& thisPlayer = GET_PLAYER(getOwner());13701 CvTeam& thisTeam = GET_TEAM(getTeam());13702 thisTeam.changeProjectCount(eProjectType, 1);1370313704 ProjectTypes ApolloProgram = (ProjectTypes) GC.getSPACE_RACE_TRIGGER_PROJECT();13705 ProjectTypes capsuleID = (ProjectTypes) GC.getSPACESHIP_CAPSULE();13706 ProjectTypes boosterID = (ProjectTypes) GC.getSPACESHIP_BOOSTER();13707 ProjectTypes stasisID = (ProjectTypes) GC.getSPACESHIP_STASIS();13708 ProjectTypes engineID = (ProjectTypes) GC.getSPACESHIP_ENGINE();1370913710 enum eSpaceshipState13711 {13712 eUnderConstruction = 0x0000,13713 eFrame = 0x0001,13714 eCapsule = 0x0002,13715 eStasis_Chamber = 0x0004,13716 eEngine = 0x0008,13717 eBooster1 = 0x0010,13718 eBooster2 = 0x0020,13719 eBooster3 = 0x0040,13720 eConstructed = 0x0080,13721 };1372213723 if(eProjectType == ApolloProgram)13724 {13725 CvCity* theCapital = thisPlayer.getCapitalCity();13726 if(theCapital)13727 {13728 auto_ptr<ICvPlot1> pDllPlot(new CvDllPlot(theCapital->plot()));13729 gDLL->GameplaySpaceshipRemoved(pDllPlot.get());13730 gDLL->GameplaySpaceshipCreated(pDllPlot.get(), eUnderConstruction + eFrame);13731 }13732 }13733 else if(GC.getProjectInfo(eProjectType)->IsSpaceship())13734 {13735 VictoryTypes eVictory = (VictoryTypes)GC.getProjectInfo(eProjectType)->GetVictoryPrereq();1373613737 if(NO_VICTORY != eVictory && GET_TEAM(getTeam()).canLaunch(eVictory))13738 {13739 auto_ptr<ICvPlot1> pDllPlot(new CvDllPlot(plot()));13740 gDLL->GameplaySpaceshipEdited(pDllPlot.get(), eConstructed);13741 gDLL->sendLaunch(getOwner(), eVictory);13742 }13743 else13744 {13745 //show the spaceship progress1374613747 // this section is kind of hard-coded but it is completely hard-coded on the engine-side so I have to give it the numbers it expects13748 int spaceshipState = eFrame;1374913750 if((thisTeam.getProjectCount((ProjectTypes)capsuleID)) == 1)13751 {13752 spaceshipState += eCapsule;13753 }1375413755 if((thisTeam.getProjectCount((ProjectTypes)stasisID)) == 1)13756 {13757 spaceshipState += eStasis_Chamber;13758 }1375913760 if((thisTeam.getProjectCount((ProjectTypes)engineID)) == 1)13761 {13762 spaceshipState += eEngine;13763 }1376413765 if((thisTeam.getProjectCount((ProjectTypes)boosterID)) >= 1)13766 {13767 spaceshipState += eBooster1;13768 }1376913770 if((thisTeam.getProjectCount((ProjectTypes)boosterID)) >= 2)13771 {13772 spaceshipState += eBooster2;13773 }1377413775 if((thisTeam.getProjectCount((ProjectTypes)boosterID)) == 3)13776 {13777 spaceshipState += eBooster3;13778 }1377913780 auto_ptr<ICvPlot1> pDllPlot(new CvDllPlot(plot()));13781 gDLL->GameplaySpaceshipEdited(pDllPlot.get(), spaceshipState);13782 }13783 }1378413785 return true;13786}