From c0ec5ccabdf0648bc2c1b6c6036db9b65b613db2 Mon Sep 17 00:00:00 2001 From: TJ Brooks Date: Thu, 7 Mar 2024 14:12:53 -0600 Subject: [PATCH 1/3] initial implementation --- .../classicalneutralitaly.go | 136 ++++++++++++++++++ variants/variants.go | 2 + 2 files changed, 138 insertions(+) create mode 100644 variants/classicalneutralitaly/classicalneutralitaly.go diff --git a/variants/classicalneutralitaly/classicalneutralitaly.go b/variants/classicalneutralitaly/classicalneutralitaly.go new file mode 100644 index 0000000..1afdf23 --- /dev/null +++ b/variants/classicalneutralitaly/classicalneutralitaly.go @@ -0,0 +1,136 @@ +package classicalneutralitaly + +import ( + "time" + + "github.com/zond/godip" + "github.com/zond/godip/orders" + "github.com/zond/godip/state" + "github.com/zond/godip/variants/classical" + "github.com/zond/godip/variants/classical/start" + "github.com/zond/godip/variants/common" +) + +var ClassicalNeutralItalyVariant = common.Variant{ + Name: "Classical - Neutral Italy", + Graph: func() godip.Graph { + okNations := map[godip.Nation]bool{ + godip.Austria: true, + godip.England: true, + godip.France: true, + godip.Germany: true, + godip.Turkey: true, + godip.Russia: true, + godip.Neutral: true, + } + neutral := godip.Neutral + result := start.Graph() + for _, node := range result.Nodes { + if node.SC != nil && !okNations[*node.SC] { + node.SC = &neutral + } + } + return result + }, + Start: func() (result *state.State, err error) { + if result, err = classical.Start(); err != nil { + return + } + if err = result.SetUnits(map[godip.Province]godip.Unit{ + "edi": godip.Unit{godip.Fleet, godip.England}, + "lvp": godip.Unit{godip.Army, godip.England}, + "lon": godip.Unit{godip.Fleet, godip.England}, + "bre": godip.Unit{godip.Fleet, godip.France}, + "par": godip.Unit{godip.Army, godip.France}, + "mar": godip.Unit{godip.Army, godip.France}, + "kie": godip.Unit{godip.Fleet, godip.Germany}, + "ber": godip.Unit{godip.Army, godip.Germany}, + "mun": godip.Unit{godip.Army, godip.Germany}, + "ven": godip.Unit{godip.Army, godip.Neutral}, + "rom": godip.Unit{godip.Army, godip.Neutral}, + "nap": godip.Unit{godip.Fleet, godip.Neutral}, + "tri": godip.Unit{godip.Fleet, godip.Austria}, + "vie": godip.Unit{godip.Army, godip.Austria}, + "bud": godip.Unit{godip.Army, godip.Austria}, + "stp/sc": godip.Unit{godip.Fleet, godip.Russia}, + "mos": godip.Unit{godip.Army, godip.Russia}, + "war": godip.Unit{godip.Army, godip.Russia}, + "sev": godip.Unit{godip.Fleet, godip.Russia}, + "con": godip.Unit{godip.Army, godip.Turkey}, + "smy": godip.Unit{godip.Army, godip.Turkey}, + "ank": godip.Unit{godip.Fleet, godip.Turkey}, + }); err != nil { + return + } + result.SetSupplyCenters(map[godip.Province]godip.Nation{ + "edi": godip.England, + "lvp": godip.England, + "lon": godip.England, + "bre": godip.France, + "par": godip.France, + "mar": godip.France, + "kie": godip.Germany, + "ber": godip.Germany, + "mun": godip.Germany, + "ven": godip.Neutral, + "rom": godip.Neutral, + "nap": godip.Neutral, + "tri": godip.Austria, + "vie": godip.Austria, + "bud": godip.Austria, + "con": godip.Turkey, + "ank": godip.Turkey, + "smy": godip.Turkey, + "sev": godip.Russia, + "mos": godip.Russia, + "stp": godip.Russia, + "war": godip.Russia, + }) + return + }, + Blank: classical.Blank, + Phase: classical.NewPhase, + Parser: classical.Parser, + Nations: []godip.Nation{godip.Austria, godip.England, godip.France, godip.Germany, godip.Turkey, godip.Russia}, + PhaseTypes: classical.PhaseTypes, + Seasons: classical.Seasons, + UnitTypes: classical.UnitTypes, + SoloWinner: common.SCCountWinner(18), + ProvinceLongNames: classical.ClassicalVariant.ProvinceLongNames, + SVGMap: func() ([]byte, error) { + return classical.Asset("svg/map.svg") + }, + SVGVersion: "1", + SVGUnits: classical.SVGUnits, + CreatedBy: "", + Version: "", + Description: "A two player variant on the classical map.", + SoloSCCount: func(*state.State) int { return 18 }, + Rules: `The first to 18 Supply Centers (SC) is the winner. + Kiel and Constantinople have a canal, so fleets can exit on either side. + Armies can move from Denmark to Kiel. Italy is a Neutral power. Italy's + SCs get an army which always holds and disbands when dislodged.`, +} + +func NeutralOrders(state state.State) (ret map[godip.Province]godip.Adjudicator) { + ret = map[godip.Province]godip.Adjudicator{} + switch state.Phase().Type() { + case godip.Movement: + // Strictly this is unnecessary - because hold is the default order. + for prov, unit := range state.Units() { + if unit.Nation == godip.Neutral { + ret[prov] = orders.Hold(prov) + } + } + case godip.Adjustment: + // Rebuild any missing units. + for _, prov := range state.Graph().AllSCs() { + if n, _, ok := state.SupplyCenter(prov); ok && n == godip.Neutral { + if _, _, ok := state.Unit(prov); !ok { + ret[prov] = orders.Build(prov, godip.Army, time.Now()) + } + } + } + } + return +} diff --git a/variants/variants.go b/variants/variants.go index ff4b7d4..7255fb6 100644 --- a/variants/variants.go +++ b/variants/variants.go @@ -1,6 +1,7 @@ package variants import ( + "github.com/zond/godip/variants/classicalneutralitaly" "github.com/zond/godip/variants/beta/gatewaywest" "github.com/zond/godip/variants/classicalcrowded" "github.com/zond/godip/variants/beta/threekingdoms" @@ -36,6 +37,7 @@ func init() { var Variants = map[string]common.Variant{} var OrderedVariants = []common.Variant{ + classicalneutralitaly.ClassicalNeutralItalyVariant, gatewaywest.GatewayWestVariant, classicalcrowded.ClassicalCrowdedVariant, threekingdoms.ThreeKingdomsVariant, From 99e7736dc5cb2be249eabd965e949987a4fe7948 Mon Sep 17 00:00:00 2001 From: TJ Brooks Date: Thu, 7 Mar 2024 14:15:27 -0600 Subject: [PATCH 2/3] update versions --- variants/classicalneutralitaly/classicalneutralitaly.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/variants/classicalneutralitaly/classicalneutralitaly.go b/variants/classicalneutralitaly/classicalneutralitaly.go index 1afdf23..544ffd7 100644 --- a/variants/classicalneutralitaly/classicalneutralitaly.go +++ b/variants/classicalneutralitaly/classicalneutralitaly.go @@ -102,8 +102,8 @@ var ClassicalNeutralItalyVariant = common.Variant{ }, SVGVersion: "1", SVGUnits: classical.SVGUnits, - CreatedBy: "", - Version: "", + CreatedBy: "Unknown", + Version: "1", Description: "A two player variant on the classical map.", SoloSCCount: func(*state.State) int { return 18 }, Rules: `The first to 18 Supply Centers (SC) is the winner. From 61caede29ff8509dc79ab81066f1fb482ec9f3da Mon Sep 17 00:00:00 2001 From: TJ Brooks Date: Thu, 7 Mar 2024 14:45:28 -0600 Subject: [PATCH 3/3] fixing neutral rebuild logic --- .../classicalneutralitaly.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/variants/classicalneutralitaly/classicalneutralitaly.go b/variants/classicalneutralitaly/classicalneutralitaly.go index 544ffd7..f468453 100644 --- a/variants/classicalneutralitaly/classicalneutralitaly.go +++ b/variants/classicalneutralitaly/classicalneutralitaly.go @@ -16,11 +16,11 @@ var ClassicalNeutralItalyVariant = common.Variant{ Graph: func() godip.Graph { okNations := map[godip.Nation]bool{ godip.Austria: true, - godip.England: true, - godip.France: true, + godip.England: true, + godip.France: true, godip.Germany: true, - godip.Turkey: true, - godip.Russia: true, + godip.Turkey: true, + godip.Russia: true, godip.Neutral: true, } neutral := godip.Neutral @@ -125,11 +125,16 @@ func NeutralOrders(state state.State) (ret map[godip.Province]godip.Adjudicator) case godip.Adjustment: // Rebuild any missing units. for _, prov := range state.Graph().AllSCs() { - if n, _, ok := state.SupplyCenter(prov); ok && n == godip.Neutral { + if _, p, ok := state.SupplyCenter(prov); ok && (p == "Rome" || p == "Venice") { if _, _, ok := state.Unit(prov); !ok { ret[prov] = orders.Build(prov, godip.Army, time.Now()) } } + if _, p, ok := state.SupplyCenter(prov); ok && p == "Naples" { + if _, _, ok := state.Unit(prov); !ok { + ret[prov] = orders.Build(prov, godip.Fleet, time.Now()) + } + } } } return