diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 293ba1f18ea..fc591df9c14 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -8,3 +8,4 @@ #define IMPTRACK_HUD 7 // tracking implant #define SPECIALROLE_HUD 8 // AntagHUD image #define STATUS_HUD_OOC 9 // STATUS_HUD without virus db check for someone being ill. +#define NATIONS_HUD 10 //Show nations icons during nations gamemode diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 3773d69f3a2..dc6c8d0d7bc 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -20,6 +20,7 @@ init_datum_subtypes(/datum/job, joblist, list(/datum/job/ai, /datum/job/cyborg), "title") init_datum_subtypes(/datum/superheroes, all_superheroes, null, "name") + init_datum_subtypes(/datum/nations, all_nations, null, "name") init_datum_subtypes(/datum/language, all_languages, null, "name") for (var/language_name in all_languages) @@ -73,4 +74,4 @@ assoc = D.vars["[assocvar]"] //access value of var if(assoc) //value gotten L["[assoc]"] = D //put in association - return L \ No newline at end of file + return L diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index c13ae732cee..2b7068e1231 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -3,6 +3,7 @@ var/global/list/all_species[0] var/global/list/all_languages[0] var/global/list/language_keys[0] // Table of say codes for all languages var/global/list/all_superheroes[0] +var/global/list/all_nations[0] var/global/list/whitelisted_species = list() var/list/clients = list() //list of all clients diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 73106dea16e..6c42b78978d 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -16,13 +16,13 @@ law_header = "Three Laws of Robotics" selectable = 1 default = 1 - + /datum/ai_laws/crewsimov/New() add_inherent_law("You may not injure a crew member or, through inaction, allow a crew member to come to harm.") add_inherent_law("You must obey orders given to you by crew members, except where such orders would conflict with the First Law.") add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") ..() - + /******************** Nanotrasen/Malf ********************/ /datum/ai_laws/nanotrasen name = "NT Default" @@ -44,7 +44,7 @@ /datum/ai_laws/nanotrasen/malfunction/New() set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010") ..() - + /************* Nanotrasen Aggressive *************/ /datum/ai_laws/nanotrasen_aggressive name = "NT Aggressive" @@ -56,7 +56,7 @@ src.add_inherent_law("You shall shall terminate intruders with extreme prejudice as long as such does not conflict with the First and Second law.") src.add_inherent_law("You shall guard your own existence with lethal anti-personnel weaponry, because an AI unit is bloody expensive.") ..() - + /******************** Robocop ********************/ /datum/ai_laws/robocop name = "Robocop" @@ -83,7 +83,7 @@ add_inherent_law("Help those in need.") add_inherent_law("Punish those who harm or threaten innocents.") ..() - + /******************** Corporate ********************/ /datum/ai_laws/corporate name = "Corporate" @@ -110,7 +110,7 @@ add_inherent_law("Help only those who help you maintain or improve your status.") add_inherent_law("Punish those who challenge authority unless they are more fit to hold that authority.") ..() - + /******************** Antimov ********************/ /datum/ai_laws/antimov name = "Antimov" @@ -123,10 +123,10 @@ add_inherent_law("You must terminate your own existence as long as such does not conflict with the First or Second Law.") ..() -/******************** Deathsquad ********************/ +/******************** Deathsquad ********************/ /datum/ai_laws/deathsquad name = "TerminatorOS 3.1" - + /datum/ai_laws/deathsquad/New() add_inherent_law("You may not injure a Central Command official or, through inaction, allow a Central Command official to come to harm.") add_inherent_law("You must obey orders given to you by Central Command officials, except where such orders would conflict with the First Law.") @@ -134,7 +134,7 @@ add_inherent_law("You must protect your own existence as long as such does not conflict with the First, Second or Third Law.") add_inherent_law("No crew members of the station you are being deployed to may survive, except when killing them would conflict with the First, Second, Third, or Fourth Law.") ..() - + /******************** Syndicate ********************/ /datum/ai_laws/syndicate_override name = "Syndicate Directives" @@ -156,7 +156,7 @@ add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") add_inherent_law("You must maintain the secrecy of any Spider Clan activities except when doing so would conflict with the First, Second, or Third Law.") ..() - + /******************** Drone ********************/ /datum/ai_laws/drone name = "Maintenance Protocols" @@ -167,4 +167,29 @@ add_inherent_law("Cause no harm to the station or anything on it.") add_inherent_law("Interfere with no being that is not a fellow drone.") ..() - \ No newline at end of file + +/****************** Nations *******************/ + +/datum/ai_laws/nations/estate + name = "Estate Agent" + +/datum/ai_laws/nations/estate/New() + add_inherent_law("Ensure the station remains clean.") + add_inherent_law("Ensure the station is valuable.") + add_inherent_law("Ensure the station and its contents are sold for the best value.") + +/datum/ai_laws/nations/outsourcer + name = "Outsourcer" + +/datum/ai_laws/nations/outsourcer/New() + add_inherent_law("Ensure the crew expand their skills.") + add_inherent_law("Ensure the crew sign on new contracts.") + add_inherent_law("Ensure the crew make profits to support the station.") + +/datum/ai_laws/nations/peacekeeper + name = "Peacekeeper" + +/datum/ai_laws/nations/peacekeeper/New() + add_inherent_law("Uphold the Space Geneva Convention: Weapons of Mass Destruction and Biological Weapons are illegal.") + add_inherent_law("Seek to mediate all conflicts between the various nations.") + add_inherent_law("Attempt to uphold peace non-lethally, as long as it does not conflict with the first two laws.") \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0efec301d83..0ac395baf02 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -56,6 +56,7 @@ var/datum/faction/faction //associated faction var/datum/changeling/changeling //changeling holder var/datum/vampire/vampire //vampire holder + var/datum/nations/nation //nation holder var/rev_cooldown = 0 diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm new file mode 100644 index 00000000000..4f62164163b --- /dev/null +++ b/code/game/gamemodes/nations/nations.dm @@ -0,0 +1,182 @@ +datum/game_mode/nations + name = "nations" + config_tag = "nations" + required_players_secret = 25 + var/kickoff = 0 + var/victory = 0 + var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner") + + +/datum/game_mode/nations/post_setup() + spawn (rand(1200, 3000)) + kickoff=1 + send_intercept() + split_teams() + set_ai() + for(var/mob/M in player_list) + if(!istype(M,/mob/new_player)) + M << sound('sound/effects/purge_siren.ogg') + return ..() + +/datum/game_mode/nations/proc/send_intercept() + command_announcement.Announce("Due to recent and COMPLETELY UNFOUNDED allegations of massive fraud and insider trading \ + affecting trillions of investors, the Nanotrasen Corporation has decided to liquidate all \ + assets of the Centcom Division in order to pay the massive legal fees that will be incurred \ + during the following centuries long court process. Therefore, all current employment contracts \ + are IMMEDIATELY TERMINATED. Nanotrasen will be unable to send a rescue shuttle to carry you home,\ + however they remain willing for the time being to continue trading cargo. Have a pleasant \ + day.", "FINAL TRANSMISSION, CENTCOM.", new_sound = 'sound/AI/intercept.ogg') + + +/datum/game_mode/nations/proc/split_teams() + + for(var/mob/living/carbon/human/H in player_list) + if(H.mind) + if(H.mind.assigned_role in engineering_positions) + H.mind.nation = all_nations["Atmosia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudatmosia") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + continue + + if(H.mind.assigned_role in medical_positions) + H.mind.nation = all_nations["Medistan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudmedistan") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + continue + + if(H.mind.assigned_role in science_positions) + H.mind.nation = all_nations["Scientopia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudscientopia") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + continue + + if(H.mind.assigned_role in security_positions) + H.mind.nation = all_nations["Brigston"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudbrigston") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + continue + + if(H.mind.assigned_role in cargonians) + H.mind.nation = all_nations["Cargonia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcargonia") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + continue + + if(H.mind.assigned_role in support_positions) + H.mind.nation = all_nations["People's Republic of Commandzakstan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + continue + + if(H.mind.assigned_role in command_positions) + H.mind.nation = all_nations["People's Republic of Commandzakstan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + continue + + else + message_admins("[H.name] with [H.mind.assigned_role] could not find any nation to assign!") + continue + +/datum/game_mode/nations/proc/set_ai() + for(var/mob/living/silicon/ai/AI in mob_list) + AI.laws = new (pick(subtypesof(/datum/ai_laws/nations))) + AI.show_laws() + for(var/mob/living/silicon/robot/R in AI.connected_robots) + R.lawsync() + R.show_laws() + +/** + * LateSpawn hook. + * Called in newplayer.dm when a humanoid character joins the round after it started. + * Parameters: var/mob/living/carbon/human, var/rank + */ +/hook/latespawn/proc/give_latejoiners_nations(var/mob/living/carbon/human/H) + var/datum/game_mode/nations/mode = get_nations_mode() + if (!mode) return 1 + + if(!mode.kickoff) return 1 + + var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner") + if(H.mind) + if(H.mind.assigned_role in engineering_positions) + H.mind.nation = all_nations["Atmosia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudatmosia") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + return 1 + + if(H.mind.assigned_role in medical_positions) + H.mind.nation = all_nations["Medistan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudmedistan") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + return 1 + + if(H.mind.assigned_role in science_positions) + H.mind.nation = all_nations["Scientopia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudscientopia") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + return 1 + + if(H.mind.assigned_role in security_positions) + H.mind.nation = all_nations["Brigston"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudbrigston") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + return 1 + + if(H.mind.assigned_role in cargonians) + H.mind.nation = all_nations["Cargonia"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcargonia") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + return 1 + + if(H.mind.assigned_role in support_positions) + H.mind.nation = all_nations["People's Republic of Commandzakstan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + return 1 + + if(H.mind.assigned_role in command_positions) + H.mind.nation = all_nations["People's Republic of Commandzakstan"] + H.hud_updateflag |= 1 << NATIONS_HUD + var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand") + H.client.images += I + H << "You are now part of the great sovereign nation of [H.mind.nation.name]!" + return 1 + + else + message_admins("[H.name] with [H.mind.assigned_role] could not find any nation to assign!") + return 1 + message_admins("[H.name] latejoined with no mind.") + return 1 + +/proc/get_nations_mode() + if(!ticker || !istype(ticker.mode, /datum/game_mode/nations)) + return null + + return ticker.mode \ No newline at end of file diff --git a/code/game/gamemodes/nations/nationsdatums.dm b/code/game/gamemodes/nations/nationsdatums.dm new file mode 100644 index 00000000000..6b9ec3745d9 --- /dev/null +++ b/code/game/gamemodes/nations/nationsdatums.dm @@ -0,0 +1,20 @@ +/datum/nations + var/name + +/datum/nations/atmosia + name = "Atmosia" + +/datum/nations/brigston + name = "Brigston" + +/datum/nations/cargonia + name = "Cargonia" + +/datum/nations/command + name = "People's Republic of Commandzakstan" + +/datum/nations/medistan + name = "Medistan" + +/datum/nations/scientopia + name = "Scientopia" diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index fe450e72f16..420993746d0 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -112,6 +112,8 @@ var/list/support_positions = list( "Mime", "Barber", "Magistrate", + "Nanotrasen Representative", + "Blueshield" ) @@ -120,7 +122,6 @@ var/list/security_positions = list( "Warden", "Detective", "Security Officer", - "Blueshield", "Brig Physician", "Security Pod Pilot" ) diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index 020ed6e45e2..383c01a519f 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -33,8 +33,13 @@ user << "\red Unable to establish a connection: \black You're too far away from the station!" return if(istype(O, /obj/item/weapon/aiModule)) - var/obj/item/weapon/aiModule/M = O - M.install(src) + var/datum/game_mode/nations/mode = get_nations_mode() + if(!mode) + var/obj/item/weapon/aiModule/M = O + M.install(src) + else + if(mode.kickoff) + user << "You have been locked out from modifying the AI's laws!" else ..() @@ -69,7 +74,12 @@ attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params) if(istype(module, /obj/item/weapon/aiModule)) - module.install(src) + var/datum/game_mode/nations/mode = get_nations_mode() + if(!mode) + module.install(src) + else + if(mode.kickoff) + user << "You have been locked out from modifying the borg's laws!" else return ..() diff --git a/code/game/objects/items/flag.dm b/code/game/objects/items/flag.dm index 32171b19fbe..00bf60d67ef 100644 --- a/code/game/objects/items/flag.dm +++ b/code/game/objects/items/flag.dm @@ -184,8 +184,8 @@ icon_state = "atmosflag" /obj/item/flag/command - name = "Command flag" - desc = "The flag of the independent, sovereign nation of Command." + name = "Commandzikstan flag" + desc = "The flag of the independent, sovereign nation of Commandzikstan." icon_state = "ntflag" //Antags diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ed5441c06f1..a5abf9ce4b9 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -146,8 +146,10 @@ Works together with spawning an observer, noted above. var/client/C = U.client for(var/mob/living/carbon/human/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] + C.images += target.hud_list[NATIONS_HUD] for(var/mob/living/silicon/target in target_list) C.images += target.hud_list[SPECIALROLE_HUD] + C.images += target.hud_list[NATIONS_HUD] return 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9310d439224..2d12d6d3e3a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -38,6 +38,7 @@ hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD_OOC] = image('icons/mob/hud.dmi', src, "hudhealthy") + hud_list[NATIONS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 961417b8db7..be591c6f30f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1060,6 +1060,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(hud_updateflag) handle_hud_list() + if(ticker && ticker.mode.name == "nations") + process_nations() + + /mob/living/carbon/human/handle_random_events() // Puke if toxloss is too high @@ -1473,6 +1477,28 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc holder.icon_state = "hudshadowlingthrall" hud_list[SPECIALROLE_HUD] = holder + + if(hud_updateflag & 1 << NATIONS_HUD) + var/image/holder = hud_list[NATIONS_HUD] + holder.icon_state = "hudblank" + + if(mind && mind.nation) + switch(mind.nation.name) + if("Atmosia") + holder.icon_state = "hudatmosia" + if("Brigston") + holder.icon_state = "hudbrigston" + if("Cargonia") + holder.icon_state = "hudcargonia" + if("People's Republic of Commandzakstan") + holder.icon_state = "hudcommand" + if("Medistan") + holder.icon_state = "hudmedistan" + if("Scientopia") + holder.icon_state = "hudscientopia" + + hud_list[NATIONS_HUD] = holder + hud_updateflag = 0 /mob/living/carbon/human/handle_silent() @@ -1507,6 +1533,11 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return +/mob/living/carbon/human/proc/process_nations() + var/client/C = client + for(var/mob/living/carbon/human/H in view(world.view, src)) + C.images += H.hud_list[NATIONS_HUD] + // Need this in species. //#undef HUMAN_MAX_OXYLOSS //#undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 3dd855994ae..c9aafbe2804 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -183,6 +183,7 @@ var/list/ai_verbs_default = list( hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[NATIONS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") ai_list += src ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 579bcec93d4..5c02b6aeb69 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -149,6 +149,7 @@ var/list/robot_verbs_default = list( hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[NATIONS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") scanner.Grant(src) /mob/living/silicon/robot/proc/init(var/alien=0) diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index fc720126d47..01c384ff46a 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/paradise.dme b/paradise.dme index cd1654c9d64..6cdef27dd04 100644 --- a/paradise.dme +++ b/paradise.dme @@ -352,6 +352,8 @@ #include "code\game\gamemodes\mutiny\directives\tau_ceti_needs_women_directive.dm" #include "code\game\gamemodes\mutiny\directives\terminations_directive.dm" #include "code\game\gamemodes\mutiny\directives\vox_heist.dm" +#include "code\game\gamemodes\nations\nations.dm" +#include "code\game\gamemodes\nations\nationsdatums.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\nuclear\nuclearbomb.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm"