From 8ae8a15886bd23f05afd85512d6b481d490464fe Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Sat, 27 Apr 2024 17:48:59 -0400 Subject: [PATCH] Melnorme now are dynamic. It seems that each Melnorme is distinct at each system. In my play-testing here, they stay dead if killed. Which is, well, sensible. I don't remember if this was the behaviour in the original game. --- sc2/src/uqm/gendef.c | 22 ++- sc2/src/uqm/plandata.c | 20 +-- sc2/src/uqm/planets/generate/Makeinfo | 4 +- .../uqm/planets/generate/genmel-modern.cpp | 133 ++++++++++++++++++ sc2/src/uqm/planets/generate/genmel.c | 114 --------------- .../uqm/planets/generate/genrain-modern.cpp | 16 +-- 6 files changed, 158 insertions(+), 151 deletions(-) create mode 100644 sc2/src/uqm/planets/generate/genmel-modern.cpp delete mode 100644 sc2/src/uqm/planets/generate/genmel.c diff --git a/sc2/src/uqm/gendef.c b/sc2/src/uqm/gendef.c index f2518e47f..7339af808 100644 --- a/sc2/src/uqm/gendef.c +++ b/sc2/src/uqm/gendef.c @@ -22,7 +22,6 @@ #include -extern GenerateFunctions generateMelnormeFunctions; extern GenerateFunctions generateMyconFunctions; extern GenerateFunctions generateOrzFunctions; extern GenerateFunctions generateSolFunctions; @@ -37,8 +36,17 @@ getGenerateFunctions (STAR_DESC *const star) switch (star->Index) { // Legacy ones are disabled... - case RAINBOW_DEFINED: + case MELNORME0_DEFINED: + case MELNORME1_DEFINED: + case MELNORME2_DEFINED: + case MELNORME3_DEFINED: + case MELNORME4_DEFINED: + case MELNORME5_DEFINED: + case MELNORME6_DEFINED: + case MELNORME7_DEFINED: + case MELNORME8_DEFINED: + case RAINBOW_DEFINED: case SAMATRA_DEFINED: case ILWRATH_DEFINED: case SPATHI_DEFINED: @@ -65,16 +73,6 @@ getGenerateFunctions (STAR_DESC *const star) case SOL_DEFINED: return &generateSolFunctions; - case MELNORME0_DEFINED: - case MELNORME1_DEFINED: - case MELNORME2_DEFINED: - case MELNORME3_DEFINED: - case MELNORME4_DEFINED: - case MELNORME5_DEFINED: - case MELNORME6_DEFINED: - case MELNORME7_DEFINED: - case MELNORME8_DEFINED: - return &generateMelnormeFunctions; case BOMB_DEFINED: case UTWIG_DEFINED: return &generateUtwigFunctions; diff --git a/sc2/src/uqm/plandata.c b/sc2/src/uqm/plandata.c index 4c44bab90..99fb260be 100644 --- a/sc2/src/uqm/plandata.c +++ b/sc2/src/uqm/plandata.c @@ -542,30 +542,28 @@ STAR_DESC starmap_array[] = {{ 522, 525}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), 0, 3, 92, "Pkunk"}, {{6858, 577}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 0, 123, "Mycon Trap"}, {{4681, 916}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 6, 75, "Rainbow"}, + {{9333, 937}, MAKE_STAR (SUPER_GIANT_STAR, YELLOW_BODY, -1), 0, 2, 5, "Melnorme", "0"}, + {{1559, 993}, MAKE_STAR (SUPER_GIANT_STAR, RED_BODY, -1), 0, 1, 80, "Melnorme", "1"}, + {{1004, 1083}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 2, 27, "Slylandro"}, {{1776, 1395}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), 0, 0, 98, "Colony"}, - {{1777, 1405}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), 0, 0, 99}, - // ADAM ADDED {{1703, 1432}, MAKE_STAR (GIANT_STAR, GREEN_BODY, -1), 0, 0, 171}, - {{1752, 1450}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), SOL_DEFINED, 0, 129}, - - {{1848, 1469}, MAKE_STAR (DWARF_STAR, BLUE_BODY, -1), 0, 4, 82, "Shofixti"}, - {{1751, 1479}, MAKE_STAR (GIANT_STAR, GREEN_BODY, -1), 0, 1, 59, "Wreck"}, {{1707, 1501}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 0, 52}, + {{3352, 1940}, MAKE_STAR (SUPER_GIANT_STAR, WHITE_BODY, -1), 0, 0, 97, "Melnorme", "2"}, {{2104, 2083}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 0, 118, "Zoq-Fot-Pik Scout"}, - {{ 742, 2268}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 0, 117, "Chmmr"}, - {{3587, 2566}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 7, 86, "Androsynth"}, + {{3654, 2587}, MAKE_STAR (SUPER_GIANT_STAR, GREEN_BODY, -1), 0, 1, 86, "Melnorme", "3"}, {{9469, 2806}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 6, 61, "Druuge"}, {{6020, 2979}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 3, 13, "Rainbow"}, + {{2354, 3291}, MAKE_STAR (SUPER_GIANT_STAR, RED_BODY, -1), 0, 1, 106, "Melnorme", "4"}, {{ 229, 3666}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 1, 76, "Ilwrath"}, {{2416, 3687}, MAKE_STAR (GIANT_STAR, ORANGE_BODY, -1), 0, 5, 109, "Spathiwa"}, {{4125, 3770}, MAKE_STAR (DWARF_STAR, BLUE_BODY, -1), 0, 0, 114, "Syreen Gaia"}, @@ -577,16 +575,22 @@ STAR_DESC starmap_array[] = {{6200, 5935}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), 0, 4, 21, "Sa-Matra"}, {{1978, 5968}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 2, 54, "Umgah and Talking Pet"}, + {{1578, 6668}, MAKE_STAR (SUPER_GIANT_STAR, GREEN_BODY, -1), 0, 1, 56, "Melnorme", "5"}, + {{8625, 7000}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 1, 41, "Rainbow"}, {{ 395, 7458}, MAKE_STAR (DWARF_STAR, BLUE_BODY, -1), 0, 2, 60, "Rainbow"}, + {{5875, 7729}, MAKE_STAR (SUPER_GIANT_STAR, YELLOW_BODY, -1), 0, 1, 34, "Melnorme", "6"}, {{2836, 7857}, MAKE_STAR (DWARF_STAR, WHITE_BODY, -1), 0, 5, 53, "Rainbow"}, {{5437, 8270}, MAKE_STAR (DWARF_STAR, RED_BODY, -1), 0, 5, 48, "Rainbow"}, + {{2582, 8507}, MAKE_STAR (SUPER_GIANT_STAR, YELLOW_BODY, -1), 0, 1, 2, "Melnorme", "7"}, {{7666, 8666}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 2, 46, "Rainbow"}, {{8534, 8797}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 3, 3, "Rainbow"}, {{9960, 9042}, MAKE_STAR (GIANT_STAR, WHITE_BODY, -1), 0, 0, 42, "Rainbow"}, {{7414, 9124}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 2, 47, "Supox"}, + {{9159, 9745}, MAKE_STAR (SUPER_GIANT_STAR, BLUE_BODY, -1), 0, 1, 4, "Melnorme", "8"}, + {{MAX_X_UNIVERSE << 1, MAX_Y_UNIVERSE << 1}, 0, 0, 0, 0}, diff --git a/sc2/src/uqm/planets/generate/Makeinfo b/sc2/src/uqm/planets/generate/Makeinfo index 929efda9c..5e15d7d1e 100644 --- a/sc2/src/uqm/planets/generate/Makeinfo +++ b/sc2/src/uqm/planets/generate/Makeinfo @@ -1,5 +1,5 @@ uqm_CFILES="gendefault.c - genmel.c genmyc.c genorz.c + genmyc.c genorz.c gensol.c genthrad.c genutw.c genvux.c" uqm_HFILES="genall.h gendefault.h" @@ -10,4 +10,4 @@ uqm_CXXFILES="cxx-generator.cpp gensly-modern.cpp genshof-modern.cpp gentrap-modern.cpp gensup-modern.cpp genspa-modern.cpp genpet-modern.cpp genzoq-modern.cpp genyeh-modern.cpp genilw-modern.cpp genpku-modern.cpp gensam-modern.cpp - genrain-modern.cpp" + genrain-modern.cpp genmel-modern.cpp" diff --git a/sc2/src/uqm/planets/generate/genmel-modern.cpp b/sc2/src/uqm/planets/generate/genmel-modern.cpp new file mode 100644 index 000000000..f6db88e40 --- /dev/null +++ b/sc2/src/uqm/planets/generate/genmel-modern.cpp @@ -0,0 +1,133 @@ +//Copyright Paul Reiche, Fred Ford. 1992-2002 + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "genall.h" +#include "../../build.h" +#include "../../gendef.h" +#include "../../starmap.h" +#include "../../globdata.h" +#include "../../state.h" +#include "libs/log.h" + +#include +#include +#include + +namespace +{ + using namespace std::literals::string_literals; + using namespace Planets::exports; + + template< typename T > + T + lexical_cast( const std::string &s ) + { + std::istringstream iss{ s }; + iss.exceptions( std::istream::failbit | std::istream::badbit ); + + T rv; + iss >> rv; + + return rv; + } + + class GenerateMelnorme + : public DefaultGenerator + { + void initNpcs( SolarSystem *solarSys ) override; + + static int SelectMelnormeRefVar(); + static DWORD GetMelnormeRef(); + static void SetMelnormeRef( DWORD Ref ); + }; + + auto init= [] + { + Generator::add( "Melnorme", std::make_unique< GenerateMelnorme >() ); + + return 0xDEADBEEF; + }(); +} + + +void +GenerateMelnorme::initNpcs( SolarSystem *const solarSys ) +{ + GLOBAL (BattleGroupRef) = GetMelnormeRef (); + if (GLOBAL (BattleGroupRef) == 0) + { + CloneShipFragment (MELNORME_SHIP, &GLOBAL (npc_built_ship_q), 0); + GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1); + ReinitQueue (&GLOBAL (npc_built_ship_q)); + SetMelnormeRef (GLOBAL (BattleGroupRef)); + } + + DefaultGenerator::initNpcs (solarSys); +} + + +int +GenerateMelnorme::SelectMelnormeRefVar() +{ + const auto arg_p= CurStarDescPtr->supArg; + const std::string arg= arg_p ? arg_p : ""; + + static const std::map< std::string, int > lookups + { + { "0"s, MELNORME0_GRPOFFS0 }, + { "1"s, MELNORME1_GRPOFFS0 }, + { "2"s, MELNORME2_GRPOFFS0 }, + { "3"s, MELNORME3_GRPOFFS0 }, + { "4"s, MELNORME4_GRPOFFS0 }, + { "5"s, MELNORME5_GRPOFFS0 }, + { "6"s, MELNORME6_GRPOFFS0 }, + { "7"s, MELNORME7_GRPOFFS0 }, + { "8"s, MELNORME8_GRPOFFS0 }, + }; + + if( not lookups.count( arg ) ) return -1; + + return lookups.at( arg ); +} + +DWORD +GenerateMelnorme::GetMelnormeRef() +{ + int RefVar = SelectMelnormeRefVar (); + if (RefVar < 0) + { + log_add (log_Warning, "GetMelnormeRef(): reference unknown"); + return 0; + } + + return GET_GAME_STATE_32 (RefVar); +} + +void +GenerateMelnorme::SetMelnormeRef( DWORD Ref ) +{ + int RefVar = SelectMelnormeRefVar (); + if (RefVar < 0) + { + log_add (log_Warning, "SetMelnormeRef(): reference unknown"); + return; + } + + SET_GAME_STATE_32 (RefVar, Ref); +} + diff --git a/sc2/src/uqm/planets/generate/genmel.c b/sc2/src/uqm/planets/generate/genmel.c deleted file mode 100644 index 27f31b647..000000000 --- a/sc2/src/uqm/planets/generate/genmel.c +++ /dev/null @@ -1,114 +0,0 @@ -//Copyright Paul Reiche, Fred Ford. 1992-2002 - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "genall.h" -#include "../../build.h" -#include "../../gendef.h" -#include "../../starmap.h" -#include "../../globdata.h" -#include "../../state.h" -#include "libs/log.h" - - -static bool GenerateMelnorme_initNpcs (SOLARSYS_STATE *solarSys); - -static int SelectMelnormeRefVar (void); -static DWORD GetMelnormeRef (void); -static void SetMelnormeRef (DWORD Ref); - - -const GenerateFunctions generateMelnormeFunctions = { - /* .initNpcs = */ GenerateMelnorme_initNpcs, - /* .reinitNpcs = */ GenerateDefault_reinitNpcs, - /* .uninitNpcs = */ GenerateDefault_uninitNpcs, - /* .generatePlanets = */ GenerateDefault_generatePlanets, - /* .generateMoons = */ GenerateDefault_generateMoons, - /* .generateName = */ GenerateDefault_generateName, - /* .generateOrbital = */ GenerateDefault_generateOrbital, - /* .generateMinerals = */ GenerateDefault_generateMinerals, - /* .generateEnergy = */ GenerateDefault_generateEnergy, - /* .generateLife = */ GenerateDefault_generateLife, - /* .pickupMinerals = */ GenerateDefault_pickupMinerals, - /* .pickupEnergy = */ GenerateDefault_pickupEnergy, - /* .pickupLife = */ GenerateDefault_pickupLife, -}; - - -static bool -GenerateMelnorme_initNpcs (SOLARSYS_STATE *solarSys) -{ - GLOBAL (BattleGroupRef) = GetMelnormeRef (); - if (GLOBAL (BattleGroupRef) == 0) - { - CloneShipFragment (MELNORME_SHIP, &GLOBAL (npc_built_ship_q), 0); - GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1); - ReinitQueue (&GLOBAL (npc_built_ship_q)); - SetMelnormeRef (GLOBAL (BattleGroupRef)); - } - - GenerateDefault_initNpcs (solarSys); - - return true; -} - - -static int -SelectMelnormeRefVar (void) -{ - switch (CurStarDescPtr->Index) - { - case MELNORME0_DEFINED: return MELNORME0_GRPOFFS0; - case MELNORME1_DEFINED: return MELNORME1_GRPOFFS0; - case MELNORME2_DEFINED: return MELNORME2_GRPOFFS0; - case MELNORME3_DEFINED: return MELNORME3_GRPOFFS0; - case MELNORME4_DEFINED: return MELNORME4_GRPOFFS0; - case MELNORME5_DEFINED: return MELNORME5_GRPOFFS0; - case MELNORME6_DEFINED: return MELNORME6_GRPOFFS0; - case MELNORME7_DEFINED: return MELNORME7_GRPOFFS0; - case MELNORME8_DEFINED: return MELNORME8_GRPOFFS0; - default: - return -1; - } -} - -static DWORD -GetMelnormeRef (void) -{ - int RefVar = SelectMelnormeRefVar (); - if (RefVar < 0) - { - log_add (log_Warning, "GetMelnormeRef(): reference unknown"); - return 0; - } - - return GET_GAME_STATE_32 (RefVar); -} - -static void -SetMelnormeRef (DWORD Ref) -{ - int RefVar = SelectMelnormeRefVar (); - if (RefVar < 0) - { - log_add (log_Warning, "SetMelnormeRef(): reference unknown"); - return; - } - - SET_GAME_STATE_32 (RefVar, Ref); -} - diff --git a/sc2/src/uqm/planets/generate/genrain-modern.cpp b/sc2/src/uqm/planets/generate/genrain-modern.cpp index 1102833ee..0aa2f0ecb 100644 --- a/sc2/src/uqm/planets/generate/genrain-modern.cpp +++ b/sc2/src/uqm/planets/generate/genrain-modern.cpp @@ -23,7 +23,6 @@ #include "../../globdata.h" #include "libs/mathlib.h" -#include #include namespace @@ -31,19 +30,6 @@ namespace using namespace std::literals::string_literals; using namespace Planets::exports; - template< typename T > - T - lexical_cast( const std::string &s ) - { - std::istringstream iss{ s }; - iss.exceptions( std::istream::failbit | std::istream::badbit ); - - T rv; - iss >> rv; - - return rv; - } - class GenerateRainbowWorld : public DefaultGenerator { @@ -107,7 +93,7 @@ GenerateRainbowWorld::generateOrbital( SolarSystem *const solarSys, PLANET_DESC ++which_rainbow; ++SDPtr; } - std::cerr << "I think I'm at Rainbow world " << which_rainbow << std::endl; + std::cerr << "I think I'm at Rainbow world #" << (int) which_rainbow << std::endl; rainbow_mask |= 1 << which_rainbow; SET_GAME_STATE (RAINBOW_WORLD0, LOBYTE (rainbow_mask)); SET_GAME_STATE (RAINBOW_WORLD1, HIBYTE (rainbow_mask));