From df0065814e1c0f61a6566868ea96010f48e196e8 Mon Sep 17 00:00:00 2001 From: ianhorswill Date: Sat, 7 Nov 2015 16:53:20 -0600 Subject: [PATCH] Modified to allow multiple playsets GUI is ugly; should get redone with the new UI stuff. --- Assets/Driver.cs | 109 ++++--- Assets/MainScene.unity | Bin 27212 -> 27140 bytes Assets/Playset.cs | 43 +++ Assets/Playset.cs.meta | 12 + Assets/Playsets/Ethan play set.prolog | 316 +++++++++++++++++++++ Assets/Playsets/Ethan play set.prolog.meta | 8 + ProjectSettings/ProjectSettings.asset | Bin 39709 -> 41785 bytes ProjectSettings/ProjectVersion.txt | 2 +- 8 files changed, 447 insertions(+), 43 deletions(-) create mode 100644 Assets/Playset.cs create mode 100644 Assets/Playset.cs.meta create mode 100644 Assets/Playsets/Ethan play set.prolog create mode 100644 Assets/Playsets/Ethan play set.prolog.meta diff --git a/Assets/Driver.cs b/Assets/Driver.cs index 41f7ecc..76c3285 100644 --- a/Assets/Driver.cs +++ b/Assets/Driver.cs @@ -2,6 +2,7 @@ using Prolog; using UnityEngine; +// ReSharper disable once CheckNamespace public class Driver : MonoBehaviour { public GUIStyle CharacterNameStyle; @@ -30,41 +31,65 @@ public class Driver : MonoBehaviour private readonly object[] playerRelationships = new object[MaxPlayers]; private readonly bool[] playerRelationshipPin = new bool[MaxPlayers]; + int currentPlaysetNumber; + Playset currentPlayset; + + internal void Start() + { + SetPlayset(0); + } + + void SetPlayset(int playsetNumber) + { + currentPlaysetNumber = playsetNumber; + currentPlayset = Playset.Playsets[playsetNumber]; + Array.Clear(playerDetailPin, 0, playerDetailPin.Length); + Array.Clear(playerRelationshipPin, 0, playerRelationshipPin.Length); + } + internal void OnGUI() { var nameHeight = CharacterNameStyle.lineHeight; GUI.Label(new Rect(30, 30, 0, 0), "Fiascomatic", CharacterNameStyle); - GUI.Label(new Rect(30, 60, 100, 30), "Players:"); - countSelection = GUI.Toolbar(new Rect(80, 60, 100, 20), countSelection, playerCountStrings); + + GUI.Label(new Rect(30, 60, 100, 30), "Playset:"); + var playsetSelection = GUI.Toolbar(new Rect(0, 0, Screen.width, 20), currentPlaysetNumber, Playset.PlaysetNames); + if (playsetSelection != currentPlaysetNumber) + { + SetPlayset(playsetSelection); + } + + GUI.Label(new Rect(30, 90, 100, 30), "Players:"); + countSelection = GUI.Toolbar(new Rect(80, 90, 100, 20), countSelection, playerCountStrings); playerCount = countSelection + 3; - GUI.Label(new Rect(30, 175, 150, 300), "Click on a character name to edit it"); + GUI.Label(new Rect(30, 205, 150, 300), "Click on a character name to edit it"); - if (GUI.Button(new Rect(30, 100, 200, 60), "Let the suffering begin!")) + if (GUI.Button(new Rect(30, 130, 200, 60), "Let the suffering begin!")) { - this.Setup(); + Setup(); } for (int i = 0; i < playerCount; i++) { - var textposition = this.PlayerScreenPosition(i); + var textposition = PlayerScreenPosition(i); playerNames[i] = GUI.TextField( new Rect(textposition.x, textposition.y, 100, nameHeight), playerNames[i], - this.CharacterNameStyle); - var detailposition = this.DetailScreenPosition(i); + CharacterNameStyle); + var detailposition = DetailScreenPosition(i); GUI.Label( new Rect(detailposition.x, detailposition.y, 160, 300), playerDetailStrings[i], - this.DetailStyle); + DetailStyle); if (playerDetails[i] != null) playerDetailPin[i] = GUI.Toggle(new Rect(detailposition.x - 25, detailposition.y, 20, 20), playerDetailPin[i], ""); - var relationshipposition = this.RelationshipScreenPosition(i); + var relationshipposition = RelationshipScreenPosition(i); GUI.Label( new Rect(relationshipposition.x, relationshipposition.y, 160, 300), playerRelationshipStrings[i], - this.RelationshipStyle); + RelationshipStyle); if (playerRelationships[i] != null) playerRelationshipPin[i] = GUI.Toggle(new Rect(relationshipposition.x - 25, relationshipposition.y, 20, 20), playerRelationshipPin[i], ""); } @@ -73,43 +98,43 @@ internal void OnGUI() private void Setup() { PrologContext.DefaultStepLimit = 1000000; - switch (this.playerCount) + switch (playerCount) { case 3: - this.SolveSetup(new[] + SolveSetup(new[] { - this.RelationshipTuple(0, 1), this.RelationshipTuple(1, 2), this.RelationshipTuple(2, 0), - this.DetailTuple(0), this.DetailTuple(1), this.DetailTuple(2) + RelationshipTuple(0, 1), RelationshipTuple(1, 2), RelationshipTuple(2, 0), + DetailTuple(0), DetailTuple(1), DetailTuple(2) }); break; case 4: - this.SolveSetup(new[] + SolveSetup(new[] { - this.RelationshipTuple(0, 1), this.RelationshipTuple(1, 2), this.RelationshipTuple(2, 3), - this.RelationshipTuple(3, 0), - this.DetailTuple(0), this.DetailTuple(1), this.DetailTuple(2), - this.DetailTuple(3) + RelationshipTuple(0, 1), RelationshipTuple(1, 2), RelationshipTuple(2, 3), + RelationshipTuple(3, 0), + DetailTuple(0), DetailTuple(1), DetailTuple(2), + DetailTuple(3) }); break; case 5: - this.SolveSetup(new[] + SolveSetup(new[] { - this.RelationshipTuple(0, 1), this.RelationshipTuple(1, 2), this.RelationshipTuple(2, 3), - this.RelationshipTuple(3, 4), this.RelationshipTuple(4, 0), - this.DetailTuple(0), this.DetailTuple(1), this.DetailTuple(2), - this.DetailTuple(3), this.DetailTuple(4) + RelationshipTuple(0, 1), RelationshipTuple(1, 2), RelationshipTuple(2, 3), + RelationshipTuple(3, 4), RelationshipTuple(4, 0), + DetailTuple(0), DetailTuple(1), DetailTuple(2), + DetailTuple(3), DetailTuple(4) }); break; case 6: - this.SolveSetup(new[] + SolveSetup(new[] { - this.RelationshipTuple(0, 1), this.RelationshipTuple(1, 2), this.RelationshipTuple(2, 3), - this.RelationshipTuple(3, 4), this.RelationshipTuple(4, 5), this.RelationshipTuple(5, 0), - this.DetailTuple(0), this.DetailTuple(1), this.DetailTuple(2), - this.DetailTuple(3), this.DetailTuple(4), this.DetailTuple(5) + RelationshipTuple(0, 1), RelationshipTuple(1, 2), RelationshipTuple(2, 3), + RelationshipTuple(3, 4), RelationshipTuple(4, 5), RelationshipTuple(5, 0), + DetailTuple(0), DetailTuple(1), DetailTuple(2), + DetailTuple(3), DetailTuple(4), DetailTuple(5) }); break; } @@ -117,26 +142,26 @@ private void Setup() private void SolveSetup(object[] setup) { - using (var prologContext = PrologContext.Allocate(KnowledgeBase.Global, null)) + using (var prologContext = PrologContext.Allocate(currentPlayset.KnowledgeBase, null)) { if (!prologContext.IsTrue("make_setup", Prolog.Prolog.IListToPrologList(setup))) Debug.Log("Failed to make setup!"); else { - for (int i = 0; i < this.playerCount; i++) + for (int i = 0; i < playerCount; i++) { - this.playerRelationships[i] = Term.CopyInstantiation(setup[i]); - this.playerRelationshipStrings[i] = + playerRelationships[i] = Term.CopyInstantiation(setup[i]); + playerRelationshipStrings[i] = string.Format("{0}", ((Structure)(setup[i])).Argument(1).ToString().Replace("/", " / ")).Replace("_", " "); } - for (int i = 0; i < this.playerCount; i++) + for (int i = 0; i < playerCount; i++) { - this.playerDetails[i] = Term.CopyInstantiation(setup[this.playerCount + i]); - this.playerDetailStrings[i] = string.Format( + playerDetails[i] = Term.CopyInstantiation(setup[playerCount + i]); + playerDetailStrings[i] = string.Format( "{0}:\n{1}", - ((Structure)(setup[this.playerCount + i])).Argument(1), - ((Structure)(setup[this.playerCount + i])).Argument(2)).Replace("_", " "); + ((Structure)(setup[playerCount + i])).Argument(1), + ((Structure)(setup[playerCount + i])).Argument(2)).Replace("_", " "); } } } @@ -167,7 +192,7 @@ object DetailTuple(int player) private Vector2 PlayerScreenPosition(int i) { var center = new Vector2(Screen.width / 2f , Screen.height / 2f - 50); - var angle = i * Math.PI * 2 / this.playerCount; + var angle = i * Math.PI * 2 / playerCount; var radius = (Math.Min(Screen.width, Screen.height) * 0.5f) - 70; var textposition = center + radius * new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)); return textposition; @@ -176,7 +201,7 @@ private Vector2 PlayerScreenPosition(int i) private Vector2 RelationshipScreenPosition(int i) { var center = new Vector2(Screen.width / 2f , Screen.height / 2f - 50); - var angle = (i+0.5f) * Math.PI * 2 / this.playerCount; + var angle = (i+0.5f) * Math.PI * 2 / playerCount; var radius = (Math.Min(Screen.width, Screen.height) * 0.5f) - 70; var textposition = center + radius * new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)); return textposition; @@ -184,6 +209,6 @@ private Vector2 RelationshipScreenPosition(int i) private Vector2 DetailScreenPosition(int i) { - return this.PlayerScreenPosition(i) + new Vector2(0f, CharacterNameStyle.lineHeight); + return PlayerScreenPosition(i) + new Vector2(0f, CharacterNameStyle.lineHeight); } } diff --git a/Assets/MainScene.unity b/Assets/MainScene.unity index 4061d384b76d7b1f423060475a65245acdc2c11a..b873c27905c9ce56842d467e933f8cb910a9db7b 100644 GIT binary patch delta 689 zcmX?eg|X!dqY?u{>?a0>EEWa^27U&HH~}EdV5(=NXOw2h@bCZs|BSpFl_VTg%`|3( zZ_M|dXc7Pam5*W{n-)-64#nnLK4iNPVf$D>R;vjR>LE=CFG6y7{1{K$U2!q8z=2tQ@ zuz@Ym+^pg3xSd^Yx;#!%yIn33OPjfC%`87w5skW8ee6KveKHZv<`BEMz<_Yu) zE7T~EZ&ERHq9KU3*4Cz;IocQ5vK= zVDdw->c2oTW3ptdwCoHn1_m9VObr-A+`un+Bon0i#N@zOY1SV=6%!{H#)<>Y?~L6! zDV}ArQ{1V^6OvgbOT_yK0=^m@<%& delta 772 zcmYk4-%C?r7{{M?n>K4{hP3pg#hf*xtxg%?q8PZ9)J79a%KgxT9__@j)i#7K)=r@j zfe5`fb`j-25X9-iE&?yQh!VO{${RDf$jc(a0&9KW?I1n856}C4p6~m-&wJi8vB(w{ znTII7i|AUEi0Uvuf=I^$azGxD>2Il2VztjbyF+d3-K`Um;MeVqnf?c-rajSi$P7kg z6MEPQEGM~qrPaI}>aZ74&hR6RLEf@J%oz!O%;If=hbnv){0z7QXusevp%=X0;s+{t zv(6Ye2Kg-BrHrXrh2rsi){KR{%q&Ds*B&h*yZrR_o%c(@d%l%?^nAztXQJtPxY#XB zG%rrB82{eT6pX6ls(uy~W6E`9RL#<3B!B1^3SXXNKCLEO&aL%KIacJfDwlkIj;VISc_A+A}ZQVF5F7I76m%s(gGtegK%NSy{wDS(MjQx5<_jL?5i2 z!C#@q8edLI%`;nx4nfyb_DavSjjuH<=?$+>N$eN*r=%($I-BCLl$*_QHT9Bv(r@|T zkc)pyM|o(#ZT1e-IDO(RtKq#FeH_n34VcGu Playsets = new List(); + public static readonly string[] PlaysetNames; + static Playset() + { + string playsetsPath = Path.Combine(Application.dataPath, PlaysetsDirectory); + string[] playsetsDirectory = Directory.GetFiles(playsetsPath); + var names = new List(); + foreach (var playset in playsetsDirectory) + { + if (Path.GetExtension(playset) == ".prolog") + { + var playsetName = Path.GetFileNameWithoutExtension(playset); + if (playsetName != null) + { + Playsets.Add(new Playset(playset)); + names.Add(playsetName); + } + } + } + PlaysetNames = names.ToArray(); + } + + + private Playset(string path) + { + KnowledgeBase = new KnowledgeBase(Path.GetFileNameWithoutExtension(path), null); + KnowledgeBase.Consult(Path.Combine(Application.dataPath, "Solver.prolog")); + KnowledgeBase.Consult(path); + } + + public readonly KnowledgeBase KnowledgeBase; +} + diff --git a/Assets/Playset.cs.meta b/Assets/Playset.cs.meta new file mode 100644 index 0000000..0aff48f --- /dev/null +++ b/Assets/Playset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 907c06800e181d747b2ac004c7230679 +timeCreated: 1446932902 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Playsets/Ethan play set.prolog b/Assets/Playsets/Ethan play set.prolog new file mode 100644 index 0000000..0d0b528 --- /dev/null +++ b/Assets/Playsets/Ethan play set.prolog @@ -0,0 +1,316 @@ +% Ethan Robison +% Kevin Ye +% Daniel Thirman +% Alexander Martin + +% +% relationships +% + +roles_relation(father/son). + % son cannot be father of father +contradiction(relationship(X, father, Y), relationship(Y, father, X)). + +symmetric(brothers). +contradiction(relationship(X, brothers, Y), relationship(X, father, Y)). +contradiction(relationship(X, brothers, Y), relationship(X, cousins, Y)). + +symmetric(cousins). + % son cannot be cousin of father +contradiction(roles_relation(X, father ,Y), roles_relation(X, cousin, Y)). + +symmetric(family). +transitive(family). + +symmetric(friends). +symmetric(at_odds). +symmetric(old_schoolmates). +symmetric(old_school_enemies). +symmetric(amicable_neighbors). +symmetric(belligerent_neighbors). +symmetric(cohorts). + +generalizes(cousins, family). +generalizes(brothers, family). +generalizes(father, family). +generalizes(son, family). + + +generalizes(old_schoolmates, friends). +generalizes(amicable_neighbors, friends). +generalizes(old_school_enemies, at_odds). +generalizes(belligerent_neighbors, at_odds). + + % no need to make so many conflicting roles... +contradiction(relationship(X, friends, Y), relationship(X, at_odds, Y)). + + + +symmetric(sexual_partners). + % incest is out +contradiction(relationship(X, sexual_partners, Y), relationship(X, family, Y)). + + +roles_relation(pastor_of(X)/churchgoer_of(X)):- + religion(X). +implies(role(C, pastor_of(_)), has(C, dogearred_NIV)). +implies(role(C, pastor_of(_)), has(C, jesus_figurine)). + % one pastor_of(_) per town +contradiction(role(C, pastor_of(_)), role(D, pastor_of(_))) :- + C \= D. + +roles_relation(sheriff/criminal). +implies(role(C, sheriff), has(C, stetson_hat)). +implies(role(C, sheriff), has(C, handgun_45_caliber)). +% one sheriff per town +contradiction(role(C, sheriff), role(D, sheriff)):- + C \= D. + +roles_relation(drug_dealer/druggee). +implies(role(C, drug_dealer), role(C, criminal)). +implies(role(C, druggee), role(C, criminal)). +implies(relationship(X, drug_dealer, Y), relationship(X, cohorts, Y)). + +roles_relation(bartender/bar_patron). +roles_relation(gas_station_clerk/gas_station_patron). +roles_relation(car_salesman/dealership_patron). +roles_relation(mechanic/bodyshop_patron). + +roles_relation(scientist/subject). +implies(role(C, scientist), has(C, walkie_talkie)). +implies(role(C, scientist), has(C, secret_facility_id_card)). + +roles_relation(secret_agent/person_of_interest). +implies(role(C, secret_agent), has(C, handgun_45_caliber)). +implies(role(C, secret_agent), has(C, walkie_talkie)). +implies(role(C, secret_agent), has(C, secret_facility_id_card)). +implies(role(C, secret_agent), has(C, unmarked_sedan)). + + +conflicting_roles(scientist, secret_agent). +conflicting_roles(scientist, subject). +conflicting_roles(scientist, person_of_interest). +conflicting_roles(scientist, bartender). +conflicting_roles(scientist, car_salesman). +conflicting_roles(scientist, gas_station_clerk). +conflicting_roles(scientist, mechanic). +conflicting_roles(scientist, pastor_of(_)). +conflicting_roles(scientist, sheriff). +conflicting_roles(sheriff, criminal). +conflicting_roles(sheriff, bartender). +conflicting_roles(sheriff, car_salesman). +conflicting_roles(sheriff, gas_station_clerk). +conflicting_roles(sheriff, mechanic). +conflicting_roles(sheriff, pastor_of(_)). +conflicting_roles(pastor_of(_), churchgoer_of(_)). +conflicting_roles(pastor_of(_), bar_patron). +conflicting_roles(pastor_of(_), criminal). +conflicting_roles(pastor_of(_), bartender). +conflicting_roles(pastor_of(_), car_salesman). +conflicting_roles(pastor_of(_), gas_station_clerk). +conflicting_roles(pastor_of(_), mechanic). +conflicting_roles(bartender, bar_patron). +conflicting_roles(bartender, car_salesman). +conflicting_roles(bartender, gas_station_clerk). +conflicting_roles(bartender, mechanic). +conflicting_roles(gas_station_clerk, car_salesman). +conflicting_roles(gas_station_clerk, gas_station_patron). +conflicting_roles(gas_station_patron, mechanic). +conflicting_roles(car_salesman, dealership_patron). +conflicting_roles(car_salesman, mechanic). +conflicting_roles(mechanic, bodyshop_patron). + + +% +% locations +% + +location(gas_station). +location(brew_thru). +location(strip_club). +location(bar). +location(winn_dixie). +location(church). +location(school). +location(house). + + +location(inside_car(X)):- + car(X). + % anyone who starts out in the boat needs to be on the river +implies(at(X, inside_car(leaky_rowboat)), at(X, river)). + +location(car_dealership). + + +location(bog). +location(tree_grove). +location(farm). +location(country_road). +location(cemetary). +location(river). + + +location(inside_spaceship). +location(mysterious_facility). +location(inside_abondoned_facility). +location(inside_active_facility). + +implies(at(C, inside_active_facility), role(C, secret_agent)). +implies(at(C, inside_abondoned_facility), role(C, secret_agent)). + +% +% objects +% + +object(X) :- + car(X). +car(red_volvo). +car(stolen_hot_rod). +car(leaky_rowboat). % laughs, this was deliberate +car(old_pickup). +car(new_pickup). +car(unmarked_sedan). + + +object(metal_detector). +object(electric_generator). +object(barrel_of_motor_oil). +object(suitcase_of_gold_bullion). + + +object(dogearred_NIV). +object(jesus_figurine). + + +object(tattered_confederate_flag). +object(collectors_shotgun). + + +object(handgun_45_caliber). +object(stetson_hat). + + +object(alien_corpse). +object(human_corpse). +contradiction(has(C, alien_corpse), has(D, alien_corpse)) :- + C \= D. +contradiction(has(C, human_corpse), has(D, human_corpse)) :- + C \= D. + + +object(walkie_talkie). +object(secret_facility_id_card). +object(vial_of_experimental_phlebotinum). + + % these sorts of things are a bit shady... +object(backpack_full_of_dynamite). +object(bloody_revolver). +implies(has(C, backpack_full_of_dynamite, role(C, criminal))). +implies(has(C, bloody_revolver), role(C, criminal)). + + +object(tesla_coil). + % tesla coils are not a common possession... +implies(has(C, tesla_coil), role(C, scientist)). + +object(truth_serum). + % truth serum is for secret agents only +implies(has(C, truth_serum), role(C, secret_agent)). + + +% +% needs +% + +need(peer_approval). +need(make_parents_proud). +need(ten_grand_by_tomorrow). +need(get_out_of_this_town). + +need(find_a_job). + % why would such a person even need a job? +contradiction(needs(C, find_a_job), has(C, suitcase_of_gold_bullion)). + +need(satisfy_curiosity). +need(build_a_flying_machine). + +need(sexual_satisfaction). + % sexual_satisfaction means that one probably is not getting any +contradiction(needs(C, sexual_satisfaction), relationship(C, sexual_partners, _)). + +need(clean_up_this_town). +implies(needs(C, clean_up_this_town), role(C, sheriff)). + +need(confirm_research_hypothesis). + % have to have a hypothesis to confirm it +implies(needs(C, confirm_research_hypothesis), role(C, scientist)). + +need(hide_facility). +need(guard_facility_secret). + % have to know about the faacility to hide/guard it +implies(needs(C, hide_facility), access_to_secrets(C)). +implies(needs(C, guard_facility_secret), access_to_secrets(C)). + + +need(keep_parole). + % have to have committed a crime to have parole +implies(needs(C, keep_parole), role(C, criminal)). + +need(pay_bar_tab). + % have to have a tab to need to pay it +implies(needs(C, pay_bar_tab), role(C, bar_patron)). +need(drink_to_forget). + % bars are a good start... +implies(needs(C, drink_to_forget), role(C, bar_patron)). + + +religion(accepting_sort_of_christianity). +religion(bigoted_sort_of_christianity). +religion(eldritch). +religion(paganism). + +sacrificing_sort_of_religion(eldritch). +sacrificing_sort_of_religion(paganism). + +need(evangelize_religion(X)) :- + religion(X). +need(follow_religion(X)) :- + religion(X). + + % to evangelize a religion one must follow that religion +implies(needs(C, evangelize_religion(X)), follows_religion(C, X)). + +need(encounter_human_for_sacrificial_religion(X)) :- + sacrificing_sort_of_religion(X). + + % to need to find a human sacrifice, one must follow that sort of religion +implies(needs(C, encounter_human_for_sacrificial_religion(X)), follows_religion(C, X)). + + % sons follow their religions of their fathers +implies((relationship(X, son, Y), follows_religion(Y, R)), follows_religion(X, R)). + % people who are trying to sacrifice a person are, knowingly or unknowingly, cohorts +implies((needs(C, encounter_human_for_sacrificial_religion(R)), needs(D, encounter_human_for_sacrificial_religion(R))), relationship(C, cohorts, D)). + +contradiction(follows_religion(C, R1), follows_religion(C, R2)) :- + R1 \= R2. + +need(drug_addiction(X)) :- + drug(X). + +need(hide_drug_addiction_to(X)) :- + drug(X). + +implies(needs(C, hide_drug_addiction_to(X)), needs(C, drug_addiction(X))). +implies(needs(C, drug_addiction(_)), role(C, druggee)). + +drug(meth). +drug(crack). +drug(bath_salts). +drug(human_blood). +drug(phlebotinum). + +need(buy_new_tires_for_car(X)):- + car(X). + % have to have a car to need tires for it +implies(needs(C, buy_new_tires_for_car(X)), has(C, X)). diff --git a/Assets/Playsets/Ethan play set.prolog.meta b/Assets/Playsets/Ethan play set.prolog.meta new file mode 100644 index 0000000..fe232b8 --- /dev/null +++ b/Assets/Playsets/Ethan play set.prolog.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 731ba742d1af8be48b88c34f44ecb50e +timeCreated: 1446935109 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index c2c607a9afd8eab1c45878a4ee6966c14095e59c..22ea8babb36511b84f6b6eda8419cc06f7dffd91 100644 GIT binary patch literal 41785 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 KPILj{KmH52Jmc&D diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index e040c5c..b11ab9b 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 5.2.0f3 +m_EditorVersion: 5.2.2f1 m_StandardAssetsVersion: 0