Shannon V. OKeets -> RE: MWIF Game Interface Design (1/29/2013 8:03:04 AM)
|
quote:
ORIGINAL: brian brian I was disappointed that LoC Vichy wasn't picked up in RaW8. I can't say I'm really a fan of the simple system of having any country aligned to France be instantly conquered. It's an easy fix, yeah. I just hope it gets a good mention in the player's documentation that this will happen. I've never seen players wanting to mess with the game by going for a Vichy NEI experience. The one country I have seen enter the Grey Zone Of What Do We Do Now With Vichy In Charge? is Yugoslavia. The Axis launch a S/O 39 invasion to keep the Russians out of Bessarabia, common enough. Then a combination of a couple bad land combat rolls, bad weather, and an attacking force on the small side result in the Yugoslavians surviving longer than France. I wish this had been fixed differently, but at least it's fixed. You hit one of my sensitive areas.[X(] It was not "an easy fix".[:-] The Vichy rules are long and were very difficult to code. CWIF had a ton of the other rules perfect, but there were numerous errors in the code for creating Vichy. Some of that was because the rules themselves had holes, which more or less doomed the code to failure when a situation arose that fell through one of those holes. It's easy to write a sentence, or even a conditional clause, in English and have players able to implement a rule. When there are ambiguities, the players can usually work out what should happen. But the code has to handle all of the possibilities - precisely. Here is the code which determines which units move because they are relocated or forced to rebase during the Vichy subphases. There's a lot more that handles the player interface where a player picks up and moves a units. --- procedure Move_Units; function DoMove(var U: TUnit): Boolean; var UnitMP: TMajorCountry; HexMP: TMajorCountry; SubCRedPart: TSubCountry; FrenchOwned: Boolean; FrenchControlled: Boolean; Res: Boolean; begin Result := False; if (not U.OnMap) or U.AboardTransport then Exit; UnitMP := UnitControllingMajorCountry(U); HexMP := Map.HexControlMajorCountry[U.Column, U.Row]; // **************************************************************************** // French Owned is different from French Controlled. The latter might include // units belonging to countries that are aligned to France. // // The following logic allows for French aligned Belgian units. // **************************************************************************** if UnitMP = VichyFrance then FrenchOwned := True else if UnitMP <> France then FrenchOwned := False else if U.Country <> France.ID then FrenchOwned := False else FrenchOwned := True; FrenchControlled := (UnitMP = VichyFrance) or (UnitMP = France); case Game.VichySubPhase of // **************************************************************************** // RAC 17.3 // The owning player moves every non-French controlled land and aircraft unit in // a Vichy French hex to the nearest hex in which it can stack that is // controlled by its major power, or a co-operating major power, or their // aligned minors. Land and air units controlled by France, but not owned by // France, which are in a Vichy controlled hex, are moved to the Conquered Pool. // // Non-French oil and build points and synthetic oil plants that are in Vichy // France, become Vichy French units. // **************************************************************************** vspMoveNonFrenchLandAir: begin if (HexMP = VichyFrance) and (U.UnitType in [utOilPoints, utBuildPoints]) then begin ChangeSourceCountry(U, VichyFrance.ID); Res := False; end else if (HexMP = VichyFrance) and (U.UnitType = utSynthOil) then begin ChangeCountry(U, VichyFrance.ID); // If rebuilt, it is Free French. Res := False; end else Res := U.OnLand and ((U is TLandUnit) or (U is TAirUnit)) and (U.UnitType <> utPartisan) and (HexMP = VichyFrance) and (not FrenchOwned); end; // **************************************************************************** // RAC 17.3 // Rebase every non-French controlled naval unit in Vichy France territories or // minor countries to the nearest friendly controlled port within double the // range of the rebasing naval units. If there is no friendly base in which it // can stack within double the naval units range, it is destroyed. // **************************************************************************** vspMoveNonFrenchNaval: Res := (U is TNavalUnit) and U.OnLand and (HexMP = VichyFrance) and (not FrenchControlled); // **************************************************************************** // RAC 17.3 // The Axis major power installing the Vichy Government moves every French // controlled unit at sea (even those disorganized) to the nearest Vichy or Free // French hex (port for naval units and their cargoes) within range in which // they may stack. If naval units cannot return to a port within range, they // are destroyed. // **************************************************************************** vspMoveFrenchAtSea: Res := FrenchControlled and U.AtSea; // **************************************************************************** // RAC 17.3 // The Axis major power installing the Vichy Government moves every French // controlled land or aircraft unit in a hex controlled by an Axis major power // to the nearest hex controlled by Vichy France or Free France. // // French Oil points, Build points, and Synthetic oil plants that end up in Axis // controlled hexes, change ownership to the Axis major power that controls the // hex in which the units reside. // **************************************************************************** vspMoveFrenchLandAirAxis: begin if (U.UnitType = utPartisan) and (HexMP = VichyFrance) then begin SubCRedPart := TSubCountry(Countries[U.Country]); if SubCRedPart.RedPartisans then begin // **************************************************************************** // If the partisan belongs to a Red Partisan country, then it needs to be given // to an Allied major power. // **************************************************************************** ChangeCountry(U, SubCRedPart.ControllingPartisanCountry.ID); Res := False; end else begin // Non-Red partisan units are simply deleted. DeleteUnit(U); PrepareMoveRemovedPool(U); Res := False; end; end else if FrenchControlled and (HexMP <> VichyFrance) and (HexMP <> nil) and (HexMP.Side = sdAxis) and (U.UnitType in [utOilPoints, utBuildPoints]) then begin ChangeSourceCountry(U, HexMP.ID); Res := False; end else if FrenchControlled and (HexMP <> VichyFrance) and (HexMP <> nil) and (HexMP.Side = sdAxis) and (U.UnitType = utSynthOil) then begin ChangeCountry(U, HexMP.ID); // If rebuilt, it is Free French. Res := False; end else Res := ((U is TLandUnit) or (U is TAirUnit)) and FrenchControlled and (HexMP <> VichyFrance) and (HexMP <> nil) and (HexMP.Side = sdAxis) and (U.UnitType <> utPartisan); end; vspMoveFrenchNavalAxis: begin // **************************************************************************** // RAC 17.3 // Rebase every French controlled naval unit in a hex controlled by an Axis // major power to the nearest port within double their range controlled by Vichy // France or Free France. They are destroyed if this is not possible. // **************************************************************************** Res := (U is TNavalUnit) and (HexMP <> VichyFrance) and (HexMP <> nil) and (HexMP.Side = sdAxis); if Res then begin Res := FrenchControlled; end; end; vspMoveFrenchLandAirAllied: // **************************************************************************** // RAC 17.3 // The same player moves any French controlled units in hexes controlled by an // Allied major power. French controlled land and air units are moved to the // nearest Vichy France or Free-French hex. // French Oil points, Build points, and Synthetic oil plants that end up in // Allied controlled hexes, are unaffected. If Free France exists, these units // remain Free French. If Free France does not exist, then these units are // removed from the game just like all other Free French units. // **************************************************************************** Res := ((U is TLandUnit) or (U is TAirUnit)) and FrenchControlled and (HexMP <> France) and (HexMP <> nil) and (HexMP.Side = sdAllied); vspMoveFrenchNavalAllied: // **************************************************************************** // RAC 17.3 // The same player moves any French controlled units in hexes controlled by an // Allied major power. French controlled naval units rebase at double their // range to the nearest Vichy France or Free-French hex. // **************************************************************************** Res := (U is TNavalUnit) and FrenchControlled and (HexMP <> France) and (HexMP <> nil) and (HexMP.Side = sdAllied); else Res := False; end; // End of case Game.VichySubPhase. // **************************************************************************** // Res = True means that the unit qualified to be moved to either the // RelocateStack, the ReturnToBaseStack, or the RebaseStack. // **************************************************************************** if Res then begin if Game.VichySubPhase = vspMoveNonFrenchLandAir then begin if not FrenchControlled then U.MoveToRelocateStack(False) else U.MoveToConqueredPool; // Non-French units aligned to France. end else if Game.VichySubPhase in [vspMoveFrenchLandAirAxis, vspMoveFrenchLandAirAllied] then U.MoveToRelocateStack(False) // Inform all players. else if Game.VichySubPhase = vspMoveFrenchAtSea then begin U.Sentry := False; U.MoveToReturnToBaseStack(False); // Inform all players. end // **************************************************************************** // vspMoveFrenchNavalAxis, vspMoveFrenchNavalAllied, vspMoveNonFrenchNaval. // **************************************************************************** else begin U.MoveToRebaseStack(False); // Inform all players. end; Result := True; end; end; begin // **************************************************************************** // Move_Units. // **************************************************************************** if MapStacks.CountEachUnitReverse(@DoMove) > 0 then CheckSupply; end;
|
|
|
|