diff --git a/code/WorkInProgress/Chemistry-Tools.dm b/code/WorkInProgress/Chemistry-Tools.dm index 648e61f1ab2..4aa0e51bdca 100644 --- a/code/WorkInProgress/Chemistry-Tools.dm +++ b/code/WorkInProgress/Chemistry-Tools.dm @@ -1044,6 +1044,23 @@ del(D) del(src) +/obj/item/weapon/reagent_containers/glass/cantister + desc = "It's a canister. Mainly used for transporting fuel." + name = "canister" + icon = 'tank.dmi' + icon_state = "canister" + item_state = "canister" + m_amt = 300 + g_amt = 0 + w_class = 5.0 + + amount_per_transfer_from_this = 20 + flags = FPRINT + New() + var/datum/reagents/R = new/datum/reagents(120) + reagents = R + R.my_atom = src + /obj/item/weapon/reagent_containers/glass/dispenser name = "reagent glass" desc = "A reagent glass." @@ -2538,7 +2555,6 @@ icon_state ="glass_brown" name = "Glass of ..what?" desc = "You can't really tell what this is." - else icon_state = "glass_empty" name = "Drinking glass" diff --git a/code/WorkInProgress/recycling/disposal.dm b/code/WorkInProgress/recycling/disposal.dm index 4548fefdeae..7563f1d3bdf 100644 --- a/code/WorkInProgress/recycling/disposal.dm +++ b/code/WorkInProgress/recycling/disposal.dm @@ -822,7 +822,6 @@ if(O) linked = O - update() return diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0e872037529..74e6560508a 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -33,4 +33,450 @@ datum/mind output += "Objective #[obj_count]: [objective.explanation_text]" obj_count++ - recipient << browse(output,"window=memory") \ No newline at end of file + recipient << browse(output,"window=memory") + + proc/edit_memory() + var/out = "[current.real_name]
" + out += "Assigned role: [assigned_role]. Edit
" + out += "Special role: " + + + var/srole + var/cantoggle = 1 + + var/datum/game_mode/current_mode = ticker.mode + switch (current_mode.config_tag) + if ("revolution") + if (src in current_mode:head_revolutionaries) + srole = "Head Revolutionary" + out += "Head Revolutionary " + cantoggle = 0 + else if(src in current_mode:revolutionaries) + srole = "Revolutionary" + out += "Head Revolutionary Revolutionary " + else + out += "Head Revolutionary Revolutionary " + + if ("cult") + if (src in current_mode:cult) + srole = "Cultist" + out += "Cultist" + cantoggle = 0 + + if ("wizard") + if (current_mode:wizard && src == current_mode:wizard) + srole = "Wizard" + out += "Wizard" + cantoggle = 0 + else + out = "Wizard " + + if ("changeling") + if (src in current_mode:changelings) + srole = "Changeling" + out += "Changeling" + cantoggle = 0 + else + out = "Changeling " + + if ("malfunction") + if (src in current_mode:malf_ai) + srole = "Malfunction" + out += "Malfunction" + cantoggle = 0 + + if ("nuclear") + if(src in current_mode:syndicates) + srole = "Syndicate" + out = "Syndicate" + cantoggle = current_mode:syndicates.len > 1 + else + out += "Syndicate " + + if (cantoggle) + if(src in current_mode.traitors) + if (special_role == "fake wizard") + out += "Traitor " + out += "Fake wizard " + srole = "Fake wizard" + else + out += "Traitor " + out += "Fake wizard " + srole = "Traitor" + else + out += "Traitor " + out += "Fake wizard " + + if (srole) + out += "Civilian " + else + out += "Civilian " + + out += "
" + + out += "Memory:
" + out += memory + out += "
Edit memory
" + out += "Objectives:
" + if (objectives.len == 0) + out += "EMPTY
" + else + var/obj_count = 1 + for(var/datum/objective/objective in objectives) + out += "[obj_count]: [objective.explanation_text] Edit Delete
" + obj_count++ + out += "Add objective

" + + out += "Announce objectives

" + + usr << browse(out, "window=edit_memory[src]") + + Topic(href, href_list) + + if (href_list["role_edit"]) + var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs() + if (!new_role) return + assigned_role = new_role + + else if (href_list["memory_edit"]) + var/new_memo = input("Write new memory", "Memory", memory) as message + if (!new_memo) return + memory = new_memo + + else if (href_list["obj_edit"] || href_list["obj_add"]) + var/datum/objective/objective = null + var/objective_pos = null + var/def_value = null + + if (href_list["obj_edit"]) + objective = locate(href_list["obj_edit"]) + if (!objective) return + objective_pos = objectives.Find(objective) + + if (istype(objective, /datum/objective/assassinate)) + def_value = "assassinate" + else if (istype(objective, /datum/objective/hijack)) + def_value = "hijack" + else if (istype(objective, /datum/objective/escape)) + def_value = "escape" + else if (istype(objective, /datum/objective/survive)) + def_value = "survive" + else if (istype(objective, /datum/objective/steal)) + def_value = "steal" + else if (istype(objective, /datum/objective/nuclear)) + def_value = "nuclear" + else if (istype(objective, /datum/objective/absorb)) + def_value = "absorb" + else if (istype(objective, /datum/objective)) + def_value = "custom" + // TODO: cult objectives + //else if (istype(objective, /datum/objective/eldergod)) + // def_value = "eldergod" + //else if (istype(objective, /datum/objective/survivecult)) + // def_value = "survivecult" + //else if (istype(objective, /datum/objective/sacrifice)) + // def_value = "sacrifice" + + var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "hijack", "escape", "survive", "steal", "nuclear", "absorb", "custom") + if (!new_obj_type) return + + var/datum/objective/new_objective = null + + switch (new_obj_type) + if ("assassinate") + var/list/possible_targets = list("Free objective") + for(var/datum/mind/possible_target in ticker.minds) + if ((possible_target != src) && istype(possible_target.current, /mob/living/carbon/human)) + possible_targets += possible_target.current + + var/mob/def_target = null + if (istype(objective, /datum/objective/assassinate) && objective:target) + def_target = objective:target.current + + var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets + if (!new_target) return + + if (new_target == "Free objective") + new_objective = new /datum/objective/assassinate + new_objective.owner = src + new_objective:target = null + new_objective.explanation_text = "Free objective" + else + new_objective = new /datum/objective/assassinate + new_objective.owner = src + new_objective:target = new_target:mind + new_objective.explanation_text = "Assassinate [new_target:real_name], the [new_target:mind.assigned_role]." + + if ("hijack") + new_objective = new /datum/objective/hijack + new_objective.owner = src + + if ("escape") + new_objective = new /datum/objective/escape + new_objective.owner = src + + if ("survive") + new_objective = new /datum/objective/survive + new_objective.owner = src + + if ("steal") + var/list/items = list("custom", "captain's antique laser gun", "hand teleporter", "RCD", "jetpack", "captains jumpsuit", "functional ai", "magnetic boots") + + var/def_target = null + if (istype(objective, /datum/objective/steal)) + def_target = objective:target_name + + var/new_target = input("Select target:", "Objective target", def_target) as null|anything in items + if (!new_target) return + + if (new_target == "custom") + var/steal_target = input("Select type:","Type") as null|anything in typesof(/obj/item) + if (!steal_target) return + var/tmp_obj = new steal_target + new_target = tmp_obj:name + del(tmp_obj) + new_target = input("Enter target name:", "Objective target", new_target) as text|null + if (!new_target) return + + new_objective = new /datum/objective/steal + new_objective.owner = src + new_objective:steal_target = steal_target + + else + new_objective = new /datum/objective/steal + new_objective.owner = src + switch(new_target) + if ("captain's antique laser gun") + new_objective:steal_target = /obj/item/weapon/gun/energy/laser_gun/captain + if ("hand teleporter") + new_objective:steal_target = /obj/item/weapon/hand_tele + if ("RCD") + new_objective:steal_target = /obj/item/weapon/rcd + if ("jetpack") + new_objective:steal_target = /obj/item/weapon/tank/jetpack + if ("captains jumpsuit") + new_objective:steal_target = /obj/item/clothing/under/rank/captain + if ("functional ai") + new_objective:steal_target = /obj/item/device/aicard + if ("magnetic boots") + new_objective:steal_target = /obj/item/clothing/shoes/magboots + new_objective:target_name = new_target + new_objective.explanation_text = "Steal a [new_target]." + + if ("nuclear") + new_objective = new /datum/objective/nuclear + new_objective.owner = src + + if ("absorb") + var/def_num = null + if (istype(objective, /datum/objective/absorb)) + def_num = objective:num_to_eat + + var/num_to_eat = input("Number to eat:", "Objective", def_num) as text + new_objective = new /datum/objective/absorb + new_objective.owner = src + new_objective:num_to_eat = num_to_eat + new_objective.explanation_text = "Absorb [num_to_eat] compatible genomes." + + if ("custom") + var/expl = input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null + if (!expl) return + new_objective = new /datum/objective + new_objective.owner = src + new_objective.explanation_text = expl + + if (!new_objective) return + + if (objective) + objectives -= objective + objectives.Insert(objective_pos, new_objective) + else + objectives += new_objective + + else if (href_list["obj_delete"]) + var/datum/objective/objective = locate(href_list["obj_delete"]) + if (!objective) return + + objectives -= objective + + else if (href_list["traitorize"]) + // clear old memory + clear_memory(href_list["traitorize"] == "civilian" ? 0 : 1) + + var/datum/game_mode/current_mode = ticker.mode + switch (href_list["traitorize"]) + if ("headrev") + current_mode:equip_revolutionary(current) + //find first headrev + for(var/datum/mind/rev_mind in current_mode:head_revolutionaries) + // copy objectives + for (var/datum/objective/assassinate/obj in rev_mind.objectives) + var/datum/objective/assassinate/rev_obj = new + rev_obj = src + rev_obj.target = obj.target + rev_obj.explanation_text = obj.explanation_text + objectives += rev_obj + break + current_mode:update_rev_icons_added(src) + current_mode:head_revolutionaries += src + + var/obj_count = 1 + current << "\blue You are a member of the revolutionaries' leadership!" + for(var/datum/objective/objective in objectives) + current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + + if ("rev") + current_mode:add_revolutionary(src) + + if ("wizard") + if (alert("Old wizard would be unwizarded. Are you sure?", , "Yes", "No") != "Yes") return + if (current_mode:wizard) + current_mode:wizard.clear_memory(0) + current_mode:wizard = src + current_mode:equip_wizard(current) + current << "\red You are the Space Wizard!" + current.loc = pick(wizardstart) + + if ("fakewizard") + current_mode.traitors += src + current_mode.equip_wizard(current) + current << "\red You are the Space Wizard!" + current.loc = pick(wizardstart) + special_role = "fake wizard" + + if ("changeling") + if (alert("Old changeling would lost his memory. Are you sure?", , "Yes", "No") != "Yes") return + if (changeling) + changeling.clear_memory() + current_mode:changelings -= changeling + current_mode:grant_changeling_powers(current) + changeling = src + current_mode:changelings += src + + changeling.current << "\red You are a changeling!" + + if ("syndicate") + var/obj/landmark/synd_spawn = locate("landmark*Syndicate-Spawn") + current.loc = get_turf(synd_spawn) + current_mode:equip_syndicate(current) + current_mode:syndicates += src + + if ("traitor") + current_mode.equip_traitor(current) + current_mode.traitors += src + current << "You are the traitor." + special_role = "traitor" + + else if (href_list["obj_announce"]) + var/obj_count = 1 + current << "\blue Your current objectives:" + for(var/datum/objective/objective in objectives) + current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + + edit_memory() + + proc/clear_memory(var/silent = 1) + var/datum/game_mode/current_mode = ticker.mode + + // remove traitor uplinks + var/list/L = current.get_contents() + for (var/t in L) + if (istype(t, /obj/item/device/pda)) + if (t:uplink) del(t:uplink) + t:uplink = null + else if (istype(t, /obj/item/device/radio)) + if (t:traitorradio) del(t:traitorradio) + t:traitorradio = null + t:traitor_frequency = 0.0 + else if (istype(t, /obj/item/weapon/SWF_uplink) || istype(t, /obj/item/weapon/syndicate_uplink)) + if (t:origradio) + var/obj/item/device/radio/R = t:origradio + R.loc = current.loc + R.traitorradio = null + R.traitor_frequency = 0.0 + del(t) + + // remove wizards spells + current.verbs -= /client/proc/jaunt + current.verbs -= /client/proc/magicmissile + current.verbs -= /client/proc/fireball + current.verbs -= /mob/proc/kill + current.verbs -= /mob/proc/tech + current.verbs -= /client/proc/smokecloud + current.verbs -= /client/proc/blind + current.verbs -= /client/proc/forcewall + current.verbs -= /mob/proc/teleport + current.verbs -= /client/proc/mutate + current.verbs -= /client/proc/knock + + // clear memory + memory = "" + special_role = null + + // remove from traitors list + if (src in current_mode.traitors) + current_mode.traitors -= src + if (!silent) + if (special_role == "fake wizard") + src.current << "\red You have been brainwashed! You are no longer a wizard!" + else + src.current << "\red You have been brainwashed! You are no longer a traitor!" + + // clear gamemode specific values + switch (current_mode.config_tag) + if ("revolution") + if (src in current_mode:head_revolutionaries) + current_mode:head_revolutionaries -= src + if (!silent) + src.current << "\red You have been brainwashed! You are no longer a head revolutionary!" + current_mode:update_rev_icons_removed(src) + + else if(src in current_mode:revolutionaries) + if (silent) + current_mode:revolutionaries -= src + current_mode:update_rev_icons_removed(src) + else + current_mode:remove_revolutionary(src) + + + if ("cult") + if (src in current_mode:cult) + current_mode:cult -= src + if (!silent) + src.current << "\red You have been brainwashed! You are no longer a cultist!" + + if ("wizard") + if (src == current_mode:wizard) + current_mode:wizard = null + //current_mode.wizards -= src + + if (!silent) + src.current << "\red You have been brainwashed! You are no longer a wizard!" + + if ("changeling") + if (src in current_mode:changelings) + current_mode:changelings -= src + //remove verbs + current.remove_changeling_powers() + //remove changeling info + current.changeling_level = 0 + current.absorbed_dna = null + + if (!silent) + src.current << "\red You have been brainwashed! You are no longer a changeling!" + + if ("malfunction") + if (src in current_mode:malf_ai) + current_mode:malf_ai -= src + if (!silent) + src.current << "\red You have been brainwashed! You are no longer a malfunction!" + + if ("nuclear") + if (src in current_mode:syndicates) + current_mode:syndicates -= src + if (!silent) + src.current << "\red You have been brainwashed! You are no longer a syndicate!" + + diff --git a/code/defines/obj/clothing.dm b/code/defines/obj/clothing.dm index 2a736518307..50e31732a17 100644 --- a/code/defines/obj/clothing.dm +++ b/code/defines/obj/clothing.dm @@ -596,6 +596,7 @@ item_state = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO flags = FPRINT | TABLEPASS | ONESIZEFITSALL + allowed = null /obj/item/clothing/suit/armor/hos name = "armored coat" diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index afc1a7480b0..38a7d22ee7a 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -149,7 +149,7 @@ return candidates -/datum/game_mode/wizard/proc/equip_wizard(mob/living/carbon/human/wizard_mob) +/datum/game_mode/proc/equip_wizard(mob/living/carbon/human/wizard_mob) if (!istype(wizard_mob)) return wizard_mob.verbs += /client/proc/jaunt diff --git a/code/game/objects/devices/PDA.dm b/code/game/objects/devices/PDA.dm index b380fa960ff..0f3b2721ddc 100644 --- a/code/game/objects/devices/PDA.dm +++ b/code/game/objects/devices/PDA.dm @@ -176,7 +176,7 @@ for(var/d in signal.data) world << "- [d] = [signal.data[d]]" */ - if(signal.data["type"] == "secbot") + if (signal.data["type"] == "secbot") if(!botlist) botlist = new() @@ -187,7 +187,7 @@ var/list/b = signal.data botstatus = b.Copy() - if(istype(P)) P.updateSelfDialog() + if (istype(P)) P.updateSelfDialog() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 8c71cb0c8cf..e2aeed40d80 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -219,7 +219,7 @@ var/showadminmessages = 1 message_admins("\blue[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") del(M.client) - //del(M) // See not reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. + //del(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends. if("No") var/reason = input(usr,"Reason?","reason","Griefer") as text if(!reason) @@ -670,6 +670,11 @@ var/showadminmessages = 1 return var/mob/M = locate(href_list["traitor"]) var/datum/game_mode/current_mode = ticker.mode + + if (istype(M, /mob/living/carbon/human) && M:mind) + M:mind.edit_memory() + return + switch(current_mode.config_tag) if("revolution") if(M.mind in current_mode:head_revolutionaries) @@ -2170,6 +2175,16 @@ var/showadminmessages = 1 alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null) return + +/obj/admins/proc/edit_memory(var/mob/M in world) + set category = "Special Verbs" + set desc = "Edit traitor's objectives" + set name = "Traitor Objectives" + + if (!M.mind) + usr << "Sorry, this mob have no mind!" + M.mind.edit_memory() + // // //ALL DONE diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 81ce4a34ea6..de7de232a04 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -116,6 +116,7 @@ src.verbs += /proc/release src.verbs += /proc/togglebuildmode src.verbs += /proc/toggle_adminmsg + src.verbs += /obj/admins/proc/edit_memory // src.verbs += /client/proc/grillify // src.verbs += /client/proc/cmd_admin_list_admins @@ -214,6 +215,7 @@ src.verbs += /proc/release src.verbs += /proc/togglebuildmode src.verbs += /proc/toggle_adminmsg + src.verbs += /obj/admins/proc/edit_memory // src.verbs += /obj/admins/proc/togglegoonsay // src.verbs += /client/proc/grillify @@ -367,6 +369,7 @@ src.verbs += /client/proc/cmd_admin_create_centcom_report src.verbs += /client/proc/cmd_admin_subtle_message src.verbs += /client/proc/warn + src.verbs += /obj/admins/proc/edit_memory if ("Administrator") @@ -416,6 +419,7 @@ src.verbs += /client/proc/admin_call_shuttle // -- Skie src.verbs += /client/proc/admin_cancel_shuttle // -- Skie + src.verbs += /obj/admins/proc/edit_memory if ("Secondary Administrator") src.holder.level = 1 @@ -452,6 +456,7 @@ src.verbs += /client/proc/cmd_admin_create_centcom_report src.verbs += /client/proc/cmd_admin_subtle_message src.verbs += /client/proc/warn + src.verbs += /obj/admins/proc/edit_memory if ("Moderator") src.holder.level = 0 @@ -588,6 +593,7 @@ src.verbs -= /client/proc/toggle_view_range src.verbs -= /obj/admins/proc/toggle_aliens + src.verbs -= /obj/admins/proc/edit_memory if(src.holder) src.holder.level = 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8c98f68e00d..98cd26d1f46 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -5,7 +5,7 @@ src.nutrition -= HUNGER_FACTOR/2 if(src.m_intent == "run") src.nutrition -= HUNGER_FACTOR/2 - if(src.mutations & 32 && src.m_intent == "run") + if(src.mutations & 32 && src.m_intent == "run" && src.bodytemperature <= 360) src.bodytemperature += 2 /mob/living/carbon/relaymove(var/mob/user, direction) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bcf68283189..9459cf02872 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1197,7 +1197,6 @@ if (src.r_store) src.r_store.screen_loc = ui_storage2 - if (src.back) var/t1 = src.back.icon_state src.overlays += image("icon" = 'back.dmi', "icon_state" = text("[][]", t1, (!( src.lying ) ? null : "2")), "layer" = MOB_LAYER) diff --git a/icons/mob/fullness.dmi b/icons/mob/fullness.dmi deleted file mode 100644 index 7093184b301..00000000000 Binary files a/icons/mob/fullness.dmi and /dev/null differ diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index a4e15288b87..9ec0deb78cf 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index 696520b4ca9..01b7de0cf14 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index 880bfc0dd27..883888dc8db 100644 Binary files a/icons/obj/tank.dmi and b/icons/obj/tank.dmi differ