Advertisement
Guest User

Untitled

a guest
Oct 21st, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haxe 12.68 KB | None | 0 0
  1. package;
  2.  
  3. import haxe.Constraints.FlatEnum;
  4. import haxe.ds.Map;
  5.  
  6. // import kha.Assets;
  7. // import kha.Framebuffer;
  8. // import kha.Scheduler;
  9. // import kha.System;
  10. // import kha.math.Random;
  11.  
  12. /**
  13.  * Core: Will not change frequently
  14.  */
  15. interface IFuel {
  16.     @:isVar public var requiredMaterials(get, null):Array<MaterialEnum>;
  17.     @:isVar public var requiredFuels(get, null):Array<FuelEnum>;
  18.     @:isVar public var fuel(get, null):FuelEnum;
  19.     public function addRequiredMaterial(material:MaterialEnum, units:Float):Void;
  20.     public function addRequiredFuel(fuel:FuelEnum, units:Float):Void;
  21. }
  22.  
  23. /**
  24.  * Core: Will not change frequently
  25.  */
  26. enum FuelEnum {
  27.     Bio;
  28.     Sun;
  29. }
  30.  
  31. /**
  32.  * Core: Will not change frequently
  33.  */
  34. class Fuel implements IFuel {
  35.     @:isVar public var requiredMaterials(get, null):Array<MaterialEnum> = [];
  36.     @:isVar public var requiredFuels(get, null):Array<FuelEnum> = [];
  37.     @:isVar public var fuel(get, null):FuelEnum;
  38.     @:isVar public var requiredMaterialUnits(get, null):Map<MaterialEnum, Float> = new Map();
  39.     @:isVar public var requiredFuelUnits(get, null):Map<FuelEnum, Float> = new Map();
  40.  
  41.     public function new(fuel:FuelEnum) {
  42.         this.fuel = fuel;
  43.     }
  44.  
  45.     public function addRequiredMaterial(requiredMaterial:MaterialEnum, units:Float) {
  46.         this.requiredMaterials.push(requiredMaterial);
  47.         this.requiredMaterialUnits.set(requiredMaterial, units);
  48.     }
  49.  
  50.     public function addRequiredMaterialUnits(requiredMaterial:MaterialEnum) {
  51.         this.requiredMaterials.push(requiredMaterial);
  52.     }
  53.  
  54.     public function addRequiredFuel(requiredfuel:FuelEnum, units:Float) {
  55.         this.requiredFuels.push(requiredfuel);
  56.         this.requiredFuelUnits.set(requiredfuel, units);
  57.     }
  58.  
  59.     public function get_requiredMaterials():Array<MaterialEnum> {
  60.         return requiredMaterials;
  61.     }
  62.  
  63.     public function get_requiredFuels():Array<FuelEnum> {
  64.         return requiredFuels;
  65.     }
  66.  
  67.     public function get_fuel():FuelEnum {
  68.         return fuel;
  69.     }
  70.  
  71.     public function get_requiredMaterialUnits():Map<MaterialEnum, Float> {
  72.         return requiredMaterialUnits;
  73.     }
  74.  
  75.     public function get_requiredFuelUnits():Map<FuelEnum, Float> {
  76.         return requiredFuelUnits;
  77.     }
  78. }
  79.  
  80. /**
  81.  * Will change frequently/maybe will be replaced
  82.  */
  83. class FuelBio extends Fuel {
  84.     public function new() {
  85.         super(FuelEnum.Bio);
  86.         this.addRequiredMaterial(MaterialEnum.M0, 2);
  87.         this.addRequiredFuel(FuelEnum.Sun, 1);
  88.     }
  89.  
  90.     public function calculateSomeShit():String {
  91.         return "tadaaa";
  92.     }
  93. }
  94.  
  95. /**
  96.  * Will change frequently/maybe will be replaced
  97.  */
  98. class FuelSun extends Fuel {
  99.     public function new() {
  100.         super(FuelEnum.Sun);
  101.     }
  102. }
  103.  
  104. /**
  105.  * Core: Will not change frequently
  106.  */
  107. interface IMaterialProperty {}
  108.  
  109. /**
  110.  * Core: Will not change frequently
  111.  */
  112. class MaterialProperty implements IMaterialProperty {
  113.     public function new() {}
  114. }
  115.  
  116. /**
  117.  * Will change frequently/maybe will be replaced
  118.  */
  119. class MaterialPropertyTransport extends MaterialProperty {
  120.     @:isVar public var transportsMaterials(get, null):Array<MaterialEnum> = [];
  121.     @:isVar public var transportsFuels(get, null):Array<FuelEnum> = [];
  122.  
  123.     public function new(transportsMaterials:Array<MaterialEnum>, transportsFuels:Array<FuelEnum>) {
  124.         this.transportsMaterials = transportsMaterials;
  125.         this.transportsFuels = transportsFuels;
  126.         super();
  127.     }
  128.  
  129.     public function get_transportsMaterials():Array<MaterialEnum> {
  130.         return transportsMaterials;
  131.     }
  132.  
  133.     public function get_transportsFuels():Array<FuelEnum> {
  134.         return transportsFuels;
  135.     }
  136. }
  137.  
  138. /**
  139.  * Will change frequently/maybe will be replaced
  140.  */
  141. class MaterialPropertyFuel extends MaterialProperty {
  142.     @:isVar public var fuel(get, null):Fuel;
  143.  
  144.     public function new(fuel:Fuel) {
  145.         super();
  146.         this.fuel = fuel;
  147.     }
  148.  
  149.     public function get_fuel():Fuel {
  150.         return fuel;
  151.     }
  152. }
  153.  
  154. /**
  155.  * Will change frequently/maybe will be replaced
  156.  */
  157. enum MaterialEnum {
  158.     M0;
  159.     M1;
  160.     M2;
  161. }
  162.  
  163. /**
  164.  * Core: Will not change frequently
  165.  */
  166. class Material {
  167.     @:isVar public var properties(get, null):Array<MaterialProperty>;
  168.     @:isVar public var material(get, null):MaterialEnum;
  169.  
  170.     public function new(material:MaterialEnum, properties:Array<MaterialProperty>) {
  171.         this.properties = properties;
  172.         this.material = material;
  173.     }
  174.  
  175.     public function get_properties():Array<MaterialProperty> {
  176.         return properties;
  177.     }
  178.  
  179.     public function get_material():MaterialEnum {
  180.         return material;
  181.     }
  182. }
  183.  
  184. /**
  185.  * Core: Will not change frequently
  186.  */
  187. class MaterialGroup {
  188.     @:isVar public var materials(get, null):Array<Material> = [];
  189.     @:isVar public var minMaterialsRequired(get, null):Map<MaterialEnum, Float> = new Map();
  190.     @:isVar public var minFuelRequired(get, null):Map<FuelEnum, Float> = new Map();
  191.  
  192.     public function new() {}
  193.  
  194.     public function addMaterial(material:Material) {
  195.         this.materials.push(material);
  196.     }
  197.  
  198.     public function get_materials():Array<Material> {
  199.         return materials;
  200.     }
  201.  
  202.     public function addMinMaterialsRequired(key:MaterialEnum, addUnit:Float) {
  203.         var exUnit = minMaterialsRequired.get(key); // TODO i think there is an .contains fn
  204.         if (exUnit != null) {
  205.             var newUnit = exUnit + addUnit;
  206.             minMaterialsRequired.set(key, newUnit);
  207.         } else {
  208.             minMaterialsRequired.set(key, addUnit);
  209.         }
  210.     }
  211.  
  212.     public function addMinFuelRequired(key:FuelEnum, addUnit:Float) {
  213.         var exUnit = minFuelRequired.get(key); // TODO i think there is an .contains fn
  214.         if (exUnit != null) {
  215.             var newUnit = exUnit + addUnit;
  216.             minFuelRequired.set(key, newUnit);
  217.         } else {
  218.             minFuelRequired.set(key, addUnit);
  219.         }
  220.     }
  221.  
  222.     public function get_minFuelRequired():Map<FuelEnum, Float> {
  223.         return minFuelRequired;
  224.     }
  225.  
  226.     public function get_minMaterialsRequired():Map<MaterialEnum, Float> {
  227.         return minMaterialsRequired;
  228.     }
  229. }
  230.  
  231. /**
  232.  * Will change frequently
  233.  */
  234. class MaterialPool {
  235.     @:isVar public var materials(get, null):Map<MaterialEnum, Material> = new Map();
  236.     @:isVar public var fuels(get, null):Map<FuelEnum, Fuel> = new Map();
  237.  
  238.     public function new() {
  239.         fuels.set(FuelEnum.Bio, new FuelBio());
  240.         fuels.set(FuelEnum.Sun, new Fuel(FuelEnum.Sun));
  241.  
  242.         var m0 = new Material(MaterialEnum.M0, []);
  243.         var m1 = new Material(MaterialEnum.M1, [
  244.             new MaterialPropertyTransport([MaterialEnum.M0], []),
  245.             new MaterialPropertyFuel(fuels.get(FuelEnum.Bio))
  246.         ]);
  247.         var m2 = new Material(MaterialEnum.M2, [
  248.             new MaterialPropertyTransport([], [FuelEnum.Sun]),
  249.             new MaterialPropertyFuel(fuels.get(FuelEnum.Bio)) // TODO: this kind of sucks, because u have to not forget to register above
  250.         ]);
  251.  
  252.         materials.set(MaterialEnum.M0, m0);
  253.         materials.set(MaterialEnum.M1, m1);
  254.         materials.set(MaterialEnum.M2, m2);
  255.     }
  256.  
  257.     public function get_materials():Map<MaterialEnum, Material> {
  258.         return materials;
  259.     }
  260.  
  261.     public function get_fuels():Map<FuelEnum, Fuel> {
  262.         return fuels;
  263.     }
  264.  
  265.     private function genGroups(group:MaterialGroup, fuel:Fuel, transportMaterialMap:Map<MaterialEnum, Array<MaterialEnum>>,
  266.             transportFuelMap:Map<FuelEnum, Array<MaterialEnum>>, rFuelUnits:Float = null, rMaterialUnits:Float = null):MaterialGroup {
  267.         var fuelRequiredMaterials = fuel.requiredMaterials;
  268.         var fuelRequiredfuels = fuel.requiredFuels;
  269.  
  270.         var idxRM = 0;
  271.  
  272.         for (fuelRequiredMaterial in fuelRequiredMaterials) {
  273.             var materialUnits = fuel.requiredMaterialUnits.get(fuelRequiredMaterial);
  274.             var transportMaterials = transportMaterialMap.get(fuelRequiredMaterial);
  275.  
  276.             // Find material that transports it and add
  277.             if (transportMaterials != null && transportMaterials.length > 0 && materialUnits != null) {
  278.                 var tm = materials.get(transportMaterials[0]);
  279.  
  280.                 if (tm != null) {
  281.                     for (property in tm.properties) {
  282.                         switch Type.typeof(property) {
  283.                             // And transport material can has it's own depencies
  284.                             case TClass(MaterialPropertyFuel):
  285.                                 var materialPropertyFuel = cast(property, MaterialPropertyFuel);
  286.                                 var fuelNext = materialPropertyFuel.fuel;
  287.  
  288.                                 if (fuelNext.fuel != fuel.fuel) { // Avoid recursing same fuel
  289.                                     group = genGroups(group, fuelNext, transportMaterialMap, transportFuelMap);
  290.                                 }
  291.                             case _:
  292.                         }
  293.                     }
  294.  
  295.                     group.addMinMaterialsRequired(transportMaterials[0], materialUnits);
  296.                     group.addMaterial(tm);
  297.                 }
  298.             }
  299.  
  300.             idxRM++;
  301.         }
  302.  
  303.         var idxRF = 0;
  304.  
  305.         // If Fuel depends on other materials or/and fuels, recurse
  306.         for (fuelRequiredfuel in fuelRequiredfuels) {
  307.             var fuelNext = fuels.get(fuelRequiredfuel);
  308.             var fuelUnits = fuel.requiredFuelUnits.get(fuelRequiredfuel);
  309.  
  310.             if (fuelNext != null && fuelNext.fuel != fuel.fuel) {
  311.                 group = genGroups(group, fuelNext, transportMaterialMap, transportFuelMap, fuelUnits);
  312.             }
  313.             idxRF++;
  314.         }
  315.  
  316.         // No requirements, raw fuel
  317.         if (idxRM == 0 && idxRF == 0 && rFuelUnits != null) {
  318.             // Find material that transports it and add
  319.             var transportMaterials = transportFuelMap.get(fuel.fuel);
  320.  
  321.             if (transportMaterials != null && transportMaterials.length > 0) {
  322.                 var tm = materials.get(transportMaterials[0]);
  323.  
  324.                 if (tm != null) {
  325.                     group.addMinFuelRequired(fuel.fuel, rFuelUnits);
  326.                     group.addMinMaterialsRequired(transportMaterials[0], rFuelUnits);
  327.                     group.addMaterial(tm);
  328.                 }
  329.             }
  330.         }
  331.  
  332.         return group;
  333.     }
  334.  
  335.     public function getGrops():Array<MaterialGroup> {
  336.         var groups:Array<MaterialGroup> = [];
  337.  
  338.         var transportMaterialMap:Map<MaterialEnum, Array<MaterialEnum>> = new Map();
  339.         var transportFuelMap:Map<FuelEnum, Array<MaterialEnum>> = new Map();
  340.  
  341.         for (material in materials) {
  342.             for (property in material.properties) {
  343.                 switch Type.typeof(property) {
  344.                     case TClass(MaterialPropertyTransport):
  345.                         var materialPropertyFuel = cast(property, MaterialPropertyTransport);
  346.  
  347.                         for (transportsMaterial in materialPropertyFuel.transportsMaterials) {
  348.                             var ex = transportMaterialMap.get(transportsMaterial);
  349.                             if (ex != null) {
  350.                                 ex.push(material.material);
  351.                                 transportMaterialMap.set(transportsMaterial, ex);
  352.                             } else {
  353.                                 transportMaterialMap.set(transportsMaterial, [material.material]);
  354.                             }
  355.                         }
  356.  
  357.                         for (transportsFuel in materialPropertyFuel.transportsFuels) {
  358.                             var ex = transportFuelMap.get(transportsFuel);
  359.                             if (ex != null) {
  360.                                 ex.push(material.material);
  361.                                 transportFuelMap.set(transportsFuel, ex);
  362.                             } else {
  363.                                 transportFuelMap.set(transportsFuel, [material.material]);
  364.                             }
  365.                         }
  366.  
  367.                     case _:
  368.                 }
  369.             }
  370.         }
  371.  
  372.         for (material in materials) {
  373.             var group = new MaterialGroup();
  374.             var properties = material.properties;
  375.  
  376.             for (property in properties) {
  377.                 switch Type.typeof(property) {
  378.                     case TClass(MaterialPropertyFuel):
  379.                         var materialPropertyFuel = cast(property, MaterialPropertyFuel);
  380.                         var fuel = materialPropertyFuel.fuel;
  381.  
  382.                         group = genGroups(group, fuel, transportMaterialMap, transportFuelMap);
  383.                     case _:
  384.                 }
  385.             }
  386.  
  387.             groups.push(group);
  388.         }
  389.  
  390.         return groups;
  391.     }
  392. }
  393.  
  394. /**
  395.  * Will change frequently
  396.  */
  397. class DNA {
  398.     public function new() {}
  399.  
  400.     public function generateDNA(groups:Array<MaterialGroup>) {
  401.         for (group in groups) {
  402.             trace("/////////////////////////////////////");
  403.             // trace("Group: " + group.materials.join(","));
  404.             trace("Group cost (material): " + group.minMaterialsRequired);
  405.             trace("Group cost (fuel): " + group.minFuelRequired);
  406.  
  407.             for (material in group.materials) {
  408.                 trace("-----------------------------");
  409.                 trace("Matrial: " + material.material);
  410.                 var properties = material.properties;
  411.  
  412.                 for (property in properties) {
  413.                     switch Type.typeof(property) {
  414.                         case TClass(MaterialPropertyFuel):
  415.                             trace("Fuel property");
  416.                             var materialPropertyFuel = cast(property, MaterialPropertyFuel);
  417.  
  418.                             switch Type.typeof(materialPropertyFuel.fuel) {
  419.                                 case TClass(FuelBio):
  420.                                     var fuelBio:FuelBio = cast(materialPropertyFuel.fuel, FuelBio);
  421.                                     trace("Do bio fuel stuff: " + fuelBio.calculateSomeShit());
  422.                                 case _:
  423.                                     trace("Other fuel stuff");
  424.                             }
  425.                         case _:
  426.                             trace("Other property");
  427.                     }
  428.                 }
  429.             }
  430.         }
  431.     }
  432. }
  433.  
  434. class Test {
  435.     public function new() {
  436.         var dna = new DNA();
  437.         var mp = new MaterialPool();
  438.         dna.generateDNA(mp.getGrops());
  439.     }
  440. }
  441.  
  442. class Main {
  443.     /*static function update():Void {}
  444.         static function render(frames:Array<Framebuffer>):Void {
  445.     }*/
  446.     public static function main() {
  447.         var t = new Test();
  448.  
  449.         /*System.start({title: "Project", width: 1024, height: 768}, function(_) {
  450.             // Just loading everything is ok for small projects
  451.             Assets.loadEverything(function() {
  452.                 // Avoid passing update/render directly,
  453.                 // so replacing them via code injection works
  454.                 Scheduler.addTimeTask(function() {
  455.                     update();
  456.                 }, 0, 1 / 60);
  457.                 System.notifyOnFrames(function(frames) {
  458.                     render(frames);
  459.                 });
  460.             });
  461.         });*/
  462.     }
  463. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement