From a9caf9b140139e7c610d63e2c3e8b394e77ece48 Mon Sep 17 00:00:00 2001 From: AnturK Date: Wed, 2 Dec 2015 20:53:56 +0100 Subject: [PATCH 01/28] More Bot Fixes --- code/modules/mob/living/simple_animal/bot/bot.dm | 6 ++---- .../mob/living/simple_animal/bot/ed209bot.dm | 14 ++++++++++---- .../modules/mob/living/simple_animal/bot/secbot.dm | 9 +++++++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 9d9d8428860..848bb0a29b5 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -709,7 +709,6 @@ Pass a positive integer as an argument to override a bot's default speed. //No ..() to prevent strip panel showing up - Todo: make that saner if(topic_denied(usr)) usr << "[src]'s interface is not responding!" - href_list = list() return add_fingerprint(usr) if(href_list["close"])// HUE HUE @@ -761,12 +760,11 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/proc/topic_denied(mob/user) //Access check proc for bot topics! Remember to place in a bot's individual Topic if desired. // 0 for access, 1 for denied. if(emagged == 2) //An emagged bot cannot be controlled by humans, silicons can if one hacked it. - if(hacked) //Manually emagged by a human - access denied to all. + if(!hacked) //Manually emagged by a human - access denied to all. return 1 else if(!issilicon(user)) //Bot is hacked, so only silicons are allowed access. return 1 - else - return 0 + return 0 /mob/living/simple_animal/bot/proc/hack(mob/user) var/hack diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 0151cf2e58b..bf23cfa994e 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -149,6 +149,15 @@ Auto Patrol[]"}, declare_arrests = !declare_arrests update_controls() +/mob/living/simple_animal/bot/ed209/attack_hand(mob/living/carbon/human/M) + if(M.a_intent == "harm") + threatlevel = M.assess_threat(src) + threatlevel += 6 + if(threatlevel >= 4) + target = M + mode = BOT_HUNT + return ..() + /mob/living/simple_animal/bot/ed209/attackby(obj/item/weapon/W, mob/user, params) ..() if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry. @@ -522,10 +531,7 @@ Auto Patrol[]"}, /mob/living/simple_animal/bot/ed209/RangedAttack(atom/A) if(!on) return - if(ismob(A)) - shootAt(A) - else - ..() + shootAt(A) /mob/living/simple_animal/bot/ed209/proc/stun_attack(mob/living/carbon/C) playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 71dc09c7e40..27f2ea40493 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -126,6 +126,15 @@ Auto Patrol: []"}, declare_arrests = !declare_arrests update_controls() +/mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/M) + if(M.a_intent == "harm") + threatlevel = M.assess_threat(src) + threatlevel += 6 + if(threatlevel >= 4) + target = M + mode = BOT_HUNT + return ..() + /mob/living/simple_animal/bot/secbot/attackby(obj/item/weapon/W, mob/user, params) ..() if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry. From 4b7b8a0e948514222f8379b47c68e91a00c63446 Mon Sep 17 00:00:00 2001 From: GunHog Date: Wed, 2 Dec 2015 16:16:33 -0600 Subject: [PATCH 02/28] Adds Bots to Diagnostic HUDs - Adds bots to the Diagnostic HUD. - Fixes mode tracking issues with AI's botcall interface - Added Sentience tracking to bots in PDA and AI displays - New HUD sprites by WJohnston - Moved bot defines to its own file so it can be used properly. --- code/__DEFINES/bots.dm | 25 ++++++++ code/__DEFINES/hud.dm | 1 + code/game/data_huds.dm | 40 ++++++++++++- code/modules/mob/living/silicon/ai/ai.dm | 7 ++- .../mob/living/simple_animal/bot/bot.dm | 54 +++++++++--------- icons/mob/hud.dmi | Bin 9465 -> 9768 bytes tgstation.dme | 1 + 7 files changed, 96 insertions(+), 32 deletions(-) create mode 100644 code/__DEFINES/bots.dm diff --git a/code/__DEFINES/bots.dm b/code/__DEFINES/bots.dm new file mode 100644 index 00000000000..d6da76b02e4 --- /dev/null +++ b/code/__DEFINES/bots.dm @@ -0,0 +1,25 @@ +//Bot defines, placed here so they can be read by other things! + +#define BOT_STEP_DELAY 4 //Delay between movemements + +#define DEFAULT_SCAN_RANGE 7 //default view range for finding targets. + +//Mode defines +#define BOT_IDLE 0 // idle +#define BOT_HUNT 1 // found target, hunting +#define BOT_PREP_ARREST 2 // at target, preparing to arrest +#define BOT_ARREST 3 // arresting target +#define BOT_START_PATROL 4 // start patrol +#define BOT_PATROL 5 // patrolling +#define BOT_SUMMON 6 // summoned by PDA +#define BOT_CLEANING 7 // cleaning (cleanbots) +#define BOT_REPAIRING 8 // repairing hull breaches (floorbots) +#define BOT_MOVING 9 // for clean/floor/med bots, when moving. +#define BOT_HEALING 10 // healing people (medbots) +#define BOT_RESPONDING 11 // responding to a call from the AI +#define BOT_DELIVER 12 // moving to deliver +#define BOT_GO_HOME 13 // returning to home +#define BOT_BLOCKED 14 // blocked +#define BOT_NAV 15 // computing navigation +#define BOT_WAIT_FOR_NAV 16 // waiting for nav computation +#define BOT_NO_ROUTE 17 // no destination beacon found (or no route) \ No newline at end of file diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index c10e56598de..0ac66f3092d 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -13,6 +13,7 @@ #define DIAG_HUD "9" // Silicon health bar #define DIAG_BATT_HUD "10"// Borg/Mech power meter #define DIAG_MECH_HUD "11"// Mech health bar +#define DIAG_BOT_HUD "12"// Bot HUDs //for antag huds. these are used at the /mob level #define ANTAG_HUD "12" diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 7e25943ea11..3ae2e05f76d 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -45,7 +45,7 @@ hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD) /datum/atom_hud/data/diagnostic - hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD) + hud_icons = list (DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD) /* MED/SEC/DIAG HUD HOOKS */ @@ -248,4 +248,40 @@ var/image/holder = hud_list[DIAG_STAT_HUD] holder.icon_state = null if(internal_damage) - holder.icon_state = "hudwarn" \ No newline at end of file + holder.icon_state = "hudwarn" + +/*~~~~~~~~~ + Bots! +~~~~~~~~~~*/ +/mob/living/simple_animal/bot/proc/diag_hud_set_bothealth() + var/image/holder = hud_list[DIAG_HUD] + holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" + +/mob/living/simple_animal/bot/proc/diag_hud_set_botstat() //On (With wireless on or off), Off, EMP'ed + var/image/holder = hud_list[DIAG_STAT_HUD] + if(on) + holder.icon_state = "hudstat" + else if(stat) //Generally EMP causes this + holder.icon_state = "hudoffline" + else //Bot is off + holder.icon_state = "huddead2" + +/mob/living/simple_animal/bot/proc/diag_hud_set_botmode() //Shows a bot's current operation + var/image/holder = hud_list[DIAG_BOT_HUD] + if(client) //If the bot is player controlled, it will not be following mode logic! + holder.icon_state = "hudsentient" + return + + switch(mode) + if(BOT_SUMMON, BOT_RESPONDING) //Responding to PDA or AI summons + holder.icon_state = "hudcalled" + if(BOT_CLEANING, BOT_REPAIRING, BOT_HEALING) //Cleanbot cleaning, Floorbot fixing, or Medibot Healing + holder.icon_state = "hudworking" + if(BOT_PATROL, BOT_START_PATROL) //Patrol mode + holder.icon_state = "hudpatrol" + if(BOT_PREP_ARREST, BOT_ARREST, BOT_HUNT) //STOP RIGHT THERE, CRIMINAL SCUM! + holder.icon_state = "hudalert" + if(BOT_MOVING, BOT_DELIVER, BOT_GO_HOME, BOT_NAV) //Moving to target for normal bots, moving to deliver or go home for MULES. + holder.icon_state = "hudmove" + else + holder.icon_state = "" \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 1115cb8aeb8..642634e0032 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -517,15 +517,16 @@ var/list/ai_list = list() var/ai_Zlevel = ai_current_turf.z var/d var/area/bot_area - d += "Query network status
" + d += "Query network status
" d += "" for (Bot in living_mob_list) if(Bot.z == ai_Zlevel && !Bot.remote_disabled) //Only non-emagged bots on the same Z-level are detected! bot_area = get_area(Bot) - d += "" + var/bot_mode = Bot.get_mode() + d += "" //If the bot is on, it will display the bot's current mode status. If the bot is not mode, it will just report "Idle". "Inactive if it is not on at all. - d += "" + d += "" d += "" d += "" d += "" diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 9d9d8428860..e47418d058f 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -1,26 +1,4 @@ -#define BOT_STEP_DELAY 4 //Delay between movemements - -#define DEFAULT_SCAN_RANGE 7 //default view range for finding targets. - -//Mode defines -#define BOT_IDLE 0 // idle -#define BOT_HUNT 1 // found target, hunting -#define BOT_PREP_ARREST 2 // at target, preparing to arrest -#define BOT_ARREST 3 // arresting target -#define BOT_START_PATROL 4 // start patrol -#define BOT_PATROL 5 // patrolling -#define BOT_SUMMON 6 // summoned by PDA -#define BOT_CLEANING 7 // cleaning (cleanbots) -#define BOT_REPAIRING 8 // repairing hull breaches (floorbots) -#define BOT_MOVING 9 // for clean/floor/med bots, when moving. -#define BOT_HEALING 10 // healing people (medbots) -#define BOT_RESPONDING 11 // responding to a call from the AI -#define BOT_DELIVER 12 // moving to deliver -#define BOT_GO_HOME 13 // returning to home -#define BOT_BLOCKED 14 // blocked -#define BOT_NAV 15 // computing navigation -#define BOT_WAIT_FOR_NAV 16 // waiting for nav computation -#define BOT_NO_ROUTE 17 // no destination beacon found (or no route) +//Defines for bots are now found in code\__DEFINES\bots.dm // AI (i.e. game AI, not the AI player) controlled bots /mob/living/simple_animal/bot @@ -92,17 +70,24 @@ "Waiting for clear path", "Calculating navigation path", "Pinging beacon network", "Unable to reach destination") //This holds text for what the bot is mode doing, reported on the remote bot control interface. + hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD) //Diagnostic HUD views + /mob/living/simple_animal/bot/proc/get_mode() - if(!mode) - return "Idle" + if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. + return "Sentient" + else if(!on) + return "Inactive" + else if(!mode) + return "Idle" else - return mode_name[mode] + return "[mode_name[mode]]" /mob/living/simple_animal/bot/proc/turn_on() if(stat) return 0 on = 1 SetLuminosity(initial(luminosity)) update_icon() + diag_hud_set_botstat() return 1 /mob/living/simple_animal/bot/proc/turn_off() @@ -125,6 +110,13 @@ bot_core = new bot_core_type(src) + prepare_huds() + var/datum/atom_hud/data/diagnostic/diag_hud = huds[DATA_HUD_DIAGNOSTIC] + diag_hud.add_to_hud(src) + diag_hud_set_bothealth() + diag_hud_set_botstat() + diag_hud_set_botmode() + /mob/living/simple_animal/bot/update_canmove() . = ..() if(!on) @@ -181,8 +173,13 @@ new /obj/effect/decal/cleanable/oil(loc) return ..(amount) +/mob/living/simple_animal/bot/updatehealth() + ..() + diag_hud_set_bothealth() + /mob/living/simple_animal/bot/handle_automated_action() //Master process which handles code common across most bots. set background = BACKGROUND_ENABLED + diag_hud_set_botmode() if(!on || client) return @@ -376,7 +373,7 @@ Pass a positive integer as an argument to override a bot's default speed. path = list() return 0 var/step_count = move_speed ? move_speed : base_speed //If a value is passed into move_speed, use that instead of the default speed var. - + if(step_count >= 1 && tries < 4) for(var/step_number = 0, step_number < step_count,step_number++) spawn(BOT_STEP_DELAY*step_number) @@ -453,6 +450,8 @@ Pass a positive integer as an argument to override a bot's default speed. access_card.access = prev_access tries = 0 mode = BOT_IDLE + diag_hud_set_botstat() + diag_hud_set_botmode() @@ -780,6 +779,7 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/Login() . = ..() access_card.access += player_access + diag_hud_set_botmode() /mob/living/simple_animal/bot/Logout() . = ..() diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 90afe2db20029c6401d98e16d4a004f4e3976c2d..81d7d489e48c900bb498a819925e97aa580411ad 100644 GIT binary patch literal 9768 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 j|LC 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 ltn+^X(f^O$UZgVo`P5x Date: Wed, 2 Dec 2015 21:51:33 +0100 Subject: [PATCH 03/28] Duh --- .../mob/living/simple_animal/bot/bot.dm | 4 +-- .../mob/living/simple_animal/bot/cleanbot.dm | 3 +- .../mob/living/simple_animal/bot/ed209bot.dm | 36 +++++++++---------- .../mob/living/simple_animal/bot/floorbot.dm | 4 ++- .../mob/living/simple_animal/bot/medbot.dm | 3 +- .../mob/living/simple_animal/bot/secbot.dm | 33 ++++++++--------- 6 files changed, 39 insertions(+), 44 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 848bb0a29b5..e154f155e1b 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -709,12 +709,12 @@ Pass a positive integer as an argument to override a bot's default speed. //No ..() to prevent strip panel showing up - Todo: make that saner if(topic_denied(usr)) usr << "[src]'s interface is not responding!" - return + return 1 add_fingerprint(usr) if(href_list["close"])// HUE HUE if(usr in users) users.Remove(usr) - return + return 1 if((href_list["power"]) && (bot_core.allowed(usr) || !locked)) if (on) turn_off() diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index cb99f07ed06..39a2336d9fd 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -231,7 +231,8 @@ text("[on ? "On" : "Off"]")) return dat /mob/living/simple_animal/bot/cleanbot/Topic(href, href_list) - ..() + if(..()) + return 1 switch(href_list["operation"]) if("blood") blood =!blood diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index bf23cfa994e..75639bb205f 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -130,7 +130,8 @@ Auto Patrol[]"}, return else if((lasercolor == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag))) return - ..() + if(..()) + return 1 switch(href_list["operation"]) if ("idcheck") @@ -149,13 +150,16 @@ Auto Patrol[]"}, declare_arrests = !declare_arrests update_controls() -/mob/living/simple_animal/bot/ed209/attack_hand(mob/living/carbon/human/M) - if(M.a_intent == "harm") - threatlevel = M.assess_threat(src) - threatlevel += 6 - if(threatlevel >= 4) - target = M - mode = BOT_HUNT +/mob/living/simple_animal/bot/ed209/proc/retaliate(mob/living/carbon/human/H) + threatlevel = H.assess_threat(src) + threatlevel += 6 + if(threatlevel >= 4) + target = H + mode = BOT_HUNT + +/mob/living/simple_animal/bot/ed209/attack_hand(mob/living/carbon/human/H) + if(H.a_intent == "harm") + retaliate(H) return ..() /mob/living/simple_animal/bot/ed209/attackby(obj/item/weapon/W, mob/user, params) @@ -164,13 +168,9 @@ Auto Patrol[]"}, return if (!istype(W, /obj/item/weapon/screwdriver) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. if(W.force && W.damtype != STAMINA)//If force is non-zero and damage type isn't stamina. - threatlevel = user.assess_threat(src) - threatlevel += 6 - if(threatlevel >= 4) - target = user - if(lasercolor)//To make up for the fact that lasertag bots don't hunt - shootAt(user) - mode = BOT_HUNT + retaliate(user) + if(lasercolor)//To make up for the fact that lasertag bots don't hunt + shootAt(user) /mob/living/simple_animal/bot/ed209/Emag(mob/user) ..() @@ -187,11 +187,7 @@ Auto Patrol[]"}, if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) if (!Proj.nodamage && Proj.damage < src.health) - threatlevel = Proj.firer.assess_threat(src) - threatlevel += 6 - if(threatlevel >= 4) - target = Proj.firer - mode = BOT_HUNT + retaliate(Proj.firer) ..() /mob/living/simple_animal/bot/ed209/handle_automated_action() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 25d8436e2e3..823579b3b96 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -118,7 +118,9 @@ user << "[src] buzzes and beeps." /mob/living/simple_animal/bot/floorbot/Topic(href, href_list) - ..() + if(..()) + return 1 + switch(href_list["operation"]) if("replace") replacetiles = !replacetiles diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index c38a3279817..a4e76f5ed73 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -157,7 +157,8 @@ return dat /mob/living/simple_animal/bot/medbot/Topic(href, href_list) - ..() + if(..()) + return 1 if(href_list["adj_threshold"]) var/adjust_num = text2num(href_list["adj_threshold"]) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 27f2ea40493..833dae0eacb 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -106,8 +106,8 @@ Auto Patrol: []"}, return dat /mob/living/simple_animal/bot/secbot/Topic(href, href_list) - - ..() + if(..()) + return 1 switch(href_list["operation"]) if("idcheck") @@ -126,13 +126,16 @@ Auto Patrol: []"}, declare_arrests = !declare_arrests update_controls() -/mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/M) - if(M.a_intent == "harm") - threatlevel = M.assess_threat(src) - threatlevel += 6 - if(threatlevel >= 4) - target = M - mode = BOT_HUNT +/mob/living/simple_animal/bot/secbot/proc/retaliate(mob/living/carbon/human/H) + threatlevel = H.assess_threat(src) + threatlevel += 6 + if(threatlevel >= 4) + target = H + mode = BOT_HUNT + +/mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/H) + if(H.a_intent == "harm") + retaliate(H) return ..() /mob/living/simple_animal/bot/secbot/attackby(obj/item/weapon/W, mob/user, params) @@ -140,11 +143,7 @@ Auto Patrol: []"}, if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm") // Any intent but harm will heal, so we shouldn't get angry. return if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. - threatlevel = user.assess_threat(src) - threatlevel += 6 - if(threatlevel >= 4) - target = user - mode = BOT_HUNT + retaliate(user) /mob/living/simple_animal/bot/secbot/Emag(mob/user) ..() @@ -161,11 +160,7 @@ Auto Patrol: []"}, if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet)) if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) if (!Proj.nodamage && Proj.damage < src.health) - threatlevel = Proj.firer.assess_threat(src) - threatlevel += 6 - if(threatlevel >= 4) - target = Proj.firer - mode = BOT_HUNT + retaliate(Proj.firer) ..() From b4911bc9fd14e6cf4d01724ce65bd7960ef30cbc Mon Sep 17 00:00:00 2001 From: AnturK Date: Thu, 3 Dec 2015 14:57:39 +0100 Subject: [PATCH 04/28] Fixes remote cyborg punches --- code/modules/mob/living/simple_animal/bot/bot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index e154f155e1b..6b6f4f34240 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -280,7 +280,7 @@ text_dehack_fail = "You fail to reset [name]." /mob/living/simple_animal/bot/attack_ai(mob/user as mob) - attack_hand(user) + show_controls(user) /mob/living/simple_animal/bot/proc/speak(message,channel) //Pass a message to have the bot say() it. Pass a frequency to say it on the radio. if((!on) || (!message)) From 61e0817fd9bea0b1d7edd66123067e5dae71890f Mon Sep 17 00:00:00 2001 From: Tkdrg Date: Thu, 3 Dec 2015 15:28:07 -0300 Subject: [PATCH 05/28] Fixes APC emp_act Fixes #13412 --- code/modules/power/apc.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index d7806edcd71..bef049e4883 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1135,9 +1135,13 @@ lighting = 0 equipment = 0 environ = 0 + update_icon() + update() spawn(600) equipment = 3 environ = 3 + update_icon() + update() ..() /obj/machinery/power/apc/ex_act(severity, target) From 9add2c776ec62a565d036dea88d4e3957bfe04ab Mon Sep 17 00:00:00 2001 From: MMMiracles Date: Thu, 3 Dec 2015 19:44:20 -0500 Subject: [PATCH 06/28] oy vey --- code/modules/mob/living/simple_animal/morph/morph.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/morph/morph.dm b/code/modules/mob/living/simple_animal/morph/morph.dm index 01653d3731c..784b7df12b6 100644 --- a/code/modules/mob/living/simple_animal/morph/morph.dm +++ b/code/modules/mob/living/simple_animal/morph/morph.dm @@ -37,11 +37,11 @@ var/morph_time = 0 var/playstyle_string = "You are a morph, an abomination of science created primarily with changeling cells. \ - You may take the form of anything nearby by middle-clicking it. This process will alert any nearby \ + You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ observers, and can only be performed once every five seconds. While morphed, you move faster, but do \ less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \ You can attack any item or dead creature to consume it - creatures will fully restore your health. \ - Finally, you can restore yourself to your original form while morphed by middle-clicking yourself." + Finally, you can restore yourself to your original form while morphed by shift-clicking yourself." /mob/living/simple_animal/hostile/morph/examine(mob/user) if(morphed) From bfdaf453b07358abc99fdced9be33614aa292071 Mon Sep 17 00:00:00 2001 From: Bjorn Neergaard Date: Fri, 4 Dec 2015 00:31:43 -0500 Subject: [PATCH 07/28] Fix Cryo checks Derp --- code/ATMOSPHERICS/components/unary_devices/cryo.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/ATMOSPHERICS/components/unary_devices/cryo.dm b/code/ATMOSPHERICS/components/unary_devices/cryo.dm index 2f79446bac7..88fb4e5bc03 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cryo.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cryo.dm @@ -59,15 +59,16 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/process() ..() - if(occupant && occupant.health >= 100 && autoEject) + if(occupant && occupant.health >= 100) on = 0 - open_machine() playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + if(autoEject) + open_machine() + if(!NODE1 || !is_operational()) return - if(AIR1) - if (occupant) + if(on && occupant) process_occupant() expel_gas() @@ -82,7 +83,7 @@ return /obj/machinery/atmospherics/components/unary/cryo_cell/container_resist() - usr << "Release sequence activated. This will take a few seconds." + usr << "You struggle inside the cryotube, kicking the release with your foot." sleep(150) if(!src || !usr || (!occupant && !contents.Find(usr))) // Make sure they didn't disappear. return @@ -260,6 +261,8 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/proc/process_occupant() var/datum/gas_mixture/air_contents = AIR1 + if(!on) + return if(air_contents.total_moles() < 10) return if(occupant) From f3f61367da0e7cfe85fbb278227101a462aee79f Mon Sep 17 00:00:00 2001 From: octareenroon91 Date: Fri, 4 Dec 2015 03:16:43 -0600 Subject: [PATCH 08/28] Give wallets merged access of all IDs inside. --- .../objects/items/weapons/storage/wallets.dm | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index d5483c8d8d0..b27b2d8e60f 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -30,20 +30,34 @@ slot_flags = SLOT_ID var/obj/item/weapon/card/id/front_id = null + var/obj/item/weapon/card/id/net_id = null -/obj/item/weapon/storage/wallet/remove_from_storage(obj/item/W, atom/new_location) +/obj/item/weapon/storage/wallet/New() + ..() + net_id = new /obj/item/weapon/card/id(src) + +/obj/item/weapon/storage/wallet/remove_from_storage(obj/item/W as obj, atom/new_location) . = ..(W, new_location) if(.) if(W == front_id) front_id = null + if(istype(W, /obj/item/weapon/card/id)) + refreshID() update_icon() -/obj/item/weapon/storage/wallet/handle_item_insertion(obj/item/W, prevent_warning = 0) +/obj/item/weapon/storage/wallet/refreshID() + net_id.access.Cut() + for(var/obj/item/weapon/card/id/I in contents) + if(!front_id) + front_id = I + net_id.access |= I.access // Merge access from any and all cards in wallet + +/obj/item/weapon/storage/wallet/handle_item_insertion(obj/item/W as obj, prevent_warning = 0) . = ..(W, prevent_warning) if(.) - if(!front_id && istype(W, /obj/item/weapon/card/id)) - front_id = W + if(istype(W, /obj/item/weapon/card/id)) + refreshID() update_icon() /obj/item/weapon/storage/wallet/update_icon() @@ -66,12 +80,12 @@ /obj/item/weapon/storage/wallet/GetID() - return front_id + return front_id // net_id is only a holder for accesses. /obj/item/weapon/storage/wallet/GetAccess() - var/obj/item/I = GetID() - if(I) - return I.GetAccess() + var/list/myaccess = net_id.GetAccess() // favor OOP by not using net_id.access directly. + if(myaccess.len) // is there any access to be had this way? + return myaccess else return ..() @@ -89,4 +103,4 @@ if(item2_type) new item2_type(src) if(item3_type) - new item3_type(src) \ No newline at end of file + new item3_type(src) From 544295c5635eec6fe5ad53590fd3de18df49cf26 Mon Sep 17 00:00:00 2001 From: octareenroon91 Date: Fri, 4 Dec 2015 03:42:54 -0600 Subject: [PATCH 09/28] define proc/refreshID --- code/game/objects/items/weapons/storage/wallets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index b27b2d8e60f..3822d76e497 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -46,7 +46,7 @@ refreshID() update_icon() -/obj/item/weapon/storage/wallet/refreshID() +/obj/item/weapon/storage/wallet/proc/refreshID() net_id.access.Cut() for(var/obj/item/weapon/card/id/I in contents) if(!front_id) From a5f0f3f594491b97881398d61f72d9e7f1684a71 Mon Sep 17 00:00:00 2001 From: MrStonedOne Date: Fri, 4 Dec 2015 04:37:16 -0800 Subject: [PATCH 10/28] changes `spawn() throw_at` to `throw_at_fast set waitfor = 0` Set waitfor = 0 has massively less overhead then spawn() but still does basically the same thing. It causes the first sleep in the stack from that point on to make the set waitfor = 0 proc return . then continue on as if it was spawn()'ed, but it doesn't have to copy over the local vars of the proc so a lot less overhead http://pastebin.com/kx538RqS --- code/game/atoms_movable.dm | 4 ++++ code/game/objects/explosion.dm | 11 +++++------ code/game/objects/items.dm | 7 +++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index da6e6895049..a3c326abfa1 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -165,6 +165,10 @@ step(src, AM.dir) ..() +/atom/movable/proc/throw_at_fast(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0) + set waitfor = 0 + throw_at(target, range, speed, thrower, spin, diagonals_first) + /atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0) if(!target || !src || (flags & NODROP)) return 0 //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index bcc57984f30..3b013c70306 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -134,12 +134,11 @@ var/throw_dir = get_dir(epicenter,T) for(var/obj/item/I in T) - spawn(0) //Simultaneously not one at a time - if(I && !I.anchored) - var/throw_range = rand(throw_dist, max_range) - var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range) - I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Reset when it finishes throwing, regardless of hitting anything) - I.throw_at(throw_at, throw_range, 2)//Throw it at 2 speed, this is purely visual anyway. + if(I && !I.anchored) + var/throw_range = rand(throw_dist, max_range) + var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range) + I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Reset when it finishes throwing, regardless of hitting anything) + I.throw_at_fast(throw_at, throw_range, 2)//Throw it at 2 speed, this is purely visual anyway. var/took = (world.timeofday-start)/10 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b15607062af..bfbd12f0b99 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -467,10 +467,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s bloody_hands_mob = null /obj/item/singularity_pull(S, current_size) - spawn(0) //this is needed or multiple items will be thrown sequentially and not simultaneously - if(current_size >= STAGE_FOUR) - throw_at(S,14,3, spin=0) - else ..() + if(current_size >= STAGE_FOUR) + throw_at_fast(S,14,3, spin=0) + else ..() /obj/item/acid_act(acidpwr, acid_volume) . = 1 From 3de101ff04b8e462fd50c5981f4336cf0b736941 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 4 Dec 2015 16:44:24 -0600 Subject: [PATCH 11/28] One revenant per round --- .../mob/living/simple_animal/revenant/revenant_spawn_event.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm index d21e9c04b03..ba32dba49ed 100644 --- a/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm +++ b/code/modules/mob/living/simple_animal/revenant/revenant_spawn_event.dm @@ -4,7 +4,7 @@ name = "Spawn Revenant" typepath = /datum/round_event/revenant weight = 7 - max_occurrences = 3 + max_occurrences = 1 earliest_start = 6000 //Meant to mix things up early-game. From 58a3f742c6cf870b44a8ace30014c0abe2762f9a Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Sat, 5 Dec 2015 10:48:52 -0500 Subject: [PATCH 12/28] Spawnable hostile constructs, for away missions and adminfuckery. --- code/datums/mind.dm | 2 +- code/datums/spells/shapeshift.dm | 6 +- code/game/gamemodes/cult/cult.dm | 2 + code/game/gamemodes/cult/runes.dm | 2 +- code/game/gamemodes/wizard/soulstone.dm | 10 +-- code/modules/admin/topic.dm | 6 +- .../mission_code/stationCollision.dm | 2 +- code/modules/mob/living/living.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 85 +++++++++++++++---- .../living/simple_animal/hostile/hostile.dm | 7 +- code/modules/mob/transform_procs.dm | 2 +- code/modules/power/singularity/narsie.dm | 2 +- 12 files changed, 94 insertions(+), 34 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 8e06a970e71..8d61b841478 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1797,7 +1797,7 @@ mind.assigned_role = "Shade" mind.special_role = "Shade" -/mob/living/simple_animal/construct/mind_initialize() +/mob/living/simple_animal/hostile/construct/mind_initialize() ..() mind.assigned_role = "[initial(name)]" mind.special_role = "Cultist" diff --git a/code/datums/spells/shapeshift.dm b/code/datums/spells/shapeshift.dm index 1a11d0476a5..68e3a07825a 100644 --- a/code/datums/spells/shapeshift.dm +++ b/code/datums/spells/shapeshift.dm @@ -31,7 +31,7 @@ var/mob/living/shape = new shapeshift_type(caster.loc) caster.loc = shape caster.status_flags |= GODMODE - + current_shapes |= shape current_casters |= caster clothes_req = 0 @@ -54,7 +54,7 @@ human_req = initial(human_req) current_casters.Remove(caster) current_shapes.Remove(shape) - + shape.mind.transfer_to(caster) qdel(shape) //Gib it maybe ? @@ -65,7 +65,7 @@ var/list/possible_shapes = list(/mob/living/simple_animal/pet/dog/corgi,\ /mob/living/simple_animal/hostile/poison/giant_spider/hunter,\ /mob/living/simple_animal/hostile/carp/megacarp,\ - /mob/living/simple_animal/construct/armored) + /mob/living/simple_animal/hostile/construct/armored) /obj/effect/proc_holder/spell/targeted/shapeshift/wild/New() ..() diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 952b6ed925c..cd0d3b4315a 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -183,6 +183,7 @@ if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind)) cult_mind.current.Paralyse(5) cult += cult_mind + cult_mind.current.faction |= "cult" cult_mind.current.cult_add_comm() update_cult_icons_added(cult_mind) cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult!" @@ -200,6 +201,7 @@ /datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1) if(cult_mind in cult) cult -= cult_mind + cult_mind.current.faction -= "cult" cult_mind.current.verbs -= /mob/living/proc/cult_innate_comm cult_mind.current.Paralyse(5) cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant." diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 19d682e3e1b..9be02034637 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -106,7 +106,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(iscultist(L)) var/mob/living/carbon/human/H = L if(!istype(H)) - if(istype(L, /mob/living/simple_animal/construct)) + if(istype(L, /mob/living/simple_animal/hostile/construct)) if(invocation) L.say(invocation) cultists_in_range++ diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 9638980408e..ce0102d3448 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -171,13 +171,13 @@ return switch(construct_class) if("Juggernaut") - makeNewConstruct(/mob/living/simple_animal/construct/armored, A, user) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, A, user) if("Wraith") - makeNewConstruct(/mob/living/simple_animal/construct/wraith, A, user) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, A, user) if("Artificer") - makeNewConstruct(/mob/living/simple_animal/construct/builder, A, user) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, A, user) qdel(T) qdel(src) @@ -186,8 +186,8 @@ return -/proc/makeNewConstruct(mob/living/simple_animal/construct/ctype, mob/target, mob/stoner = null, cultoverride = 0, loc_override = null) - var/mob/living/simple_animal/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target))) +/proc/makeNewConstruct(mob/living/simple_animal/hostile/construct/ctype, mob/target, mob/stoner = null, cultoverride = 0, loc_override = null) + var/mob/living/simple_animal/hostile/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target))) newstruct.faction |= "\ref[stoner]" newstruct.key = target.key if(stoner && iscultist(stoner) || cultoverride) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index e5123e44cb8..6aeebe17c31 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -400,9 +400,9 @@ if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob ) if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob ) if("polyparrot") M.change_mob_type( /mob/living/simple_animal/parrot/Poly , null, null, delmob ) - if("constructarmored") M.change_mob_type( /mob/living/simple_animal/construct/armored , null, null, delmob ) - if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/construct/builder , null, null, delmob ) - if("constructwraith") M.change_mob_type( /mob/living/simple_animal/construct/wraith , null, null, delmob ) + if("constructarmored") M.change_mob_type( /mob/living/simple_animal/hostile/construct/armored , null, null, delmob ) + if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/hostile/construct/builder , null, null, delmob ) + if("constructwraith") M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob ) if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob ) diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index ac53dca5b18..3805af7cb1c 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -163,7 +163,7 @@ var/sc_safecode5 = "[rand(0,9)]" desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible." move_self = 0 //Contianed narsie does not move! grav_pull = 0 //Contained narsie does not pull stuff in! - var/uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/construct) + var/uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/hostile/construct) //Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment /obj/singularity/narsie/sc_Narsie/admin_investigate_setup() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 28dee2912aa..f1754abcbd5 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -766,7 +766,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/narsie_act() if(client) - makeNewConstruct(/mob/living/simple_animal/construct/harvester, src, null, 0) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, null, 0) spawn_dust() gib() return diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 5dc4c2c0f5e..5ce368910cc 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -1,9 +1,8 @@ -/mob/living/simple_animal/construct +/mob/living/simple_animal/hostile/construct name = "Construct" real_name = "Construct" desc = "" speak_emote = list("hisses") - emote_hear = list("wails.","screeches.") response_help = "thinks better of touching" response_disarm = "flails at" response_harm = "punches" @@ -14,7 +13,6 @@ stop_automated_movement = 1 status_flags = CANPUSH attack_sound = 'sound/weapons/punch1.ogg' - environment_smash = 1 see_in_dark = 7 damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) @@ -24,16 +22,17 @@ faction = list("cult") flying = 1 unique_name = 1 + AIStatus = AI_OFF //normal constructs don't have AI var/list/construct_spells = list() var/playstyle_string = "You are a generic construct! Your job is to not exist." -/mob/living/simple_animal/construct/New() +/mob/living/simple_animal/hostile/construct/New() ..() for(var/spell in construct_spells) AddSpell(new spell(null)) -/mob/living/simple_animal/construct/death() +/mob/living/simple_animal/hostile/construct/death() ..(1) new /obj/item/weapon/ectoplasm (src.loc) visible_message("[src] collapses in a shattered heap.") @@ -41,7 +40,7 @@ qdel(src) return -/mob/living/simple_animal/construct/examine(mob/user) +/mob/living/simple_animal/hostile/construct/examine(mob/user) var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" if (src.health < src.maxHealth) msg += "" @@ -54,8 +53,8 @@ user << msg -/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M) - if(istype(M, /mob/living/simple_animal/construct/builder)) +/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M) + if(istype(M, /mob/living/simple_animal/hostile/construct/builder)) if(health < maxHealth) adjustBruteLoss(-5) if(src != M) @@ -73,16 +72,16 @@ else if(src != M) ..() -/mob/living/simple_animal/construct/Process_Spacemove(movement_dir = 0) +/mob/living/simple_animal/hostile/construct/Process_Spacemove(movement_dir = 0) return 1 -/mob/living/simple_animal/construct/narsie_act() +/mob/living/simple_animal/hostile/construct/narsie_act() return /////////////////Juggernaut/////////////// -/mob/living/simple_animal/construct/armored +/mob/living/simple_animal/hostile/construct/armored name = "Juggernaut" real_name = "Juggernaut" desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire." @@ -105,7 +104,11 @@ playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \ create shield walls, rip apart enemies and walls alike, and even deflect energy weapons." -/mob/living/simple_animal/construct/armored/bullet_act(obj/item/projectile/P) +/mob/living/simple_animal/hostile/construct/armored/hostile //actually hostile, will move around, hit things + AIStatus = AI_ON + environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP + +/mob/living/simple_animal/hostile/construct/armored/bullet_act(obj/item/projectile/P) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) var/reflectchance = 80 - round(P.damage/3) if(prob(reflectchance)) @@ -134,7 +137,7 @@ ////////////////////////Wraith///////////////////////////////////////////// -/mob/living/simple_animal/construct/wraith +/mob/living/simple_animal/hostile/construct/wraith name = "Wraith" real_name = "Wraith" desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines." @@ -144,15 +147,19 @@ health = 75 melee_damage_lower = 25 melee_damage_upper = 25 + retreat_distance = 2 //AI wraiths will move in and out of combat attacktext = "slashes" attack_sound = 'sound/weapons/bladeslice.ogg' construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift) playstyle_string = "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." +/mob/living/simple_animal/hostile/construct/wraith/hostile //actually hostile, will move around, hit things + AIStatus = AI_ON + /////////////////////////////Artificer///////////////////////// -/mob/living/simple_animal/construct/builder +/mob/living/simple_animal/hostile/construct/builder name = "Artificer" real_name = "Artificer" desc = "A bulbous construct dedicated to building and maintaining the Cult of Nar-Sie's armies." @@ -164,6 +171,8 @@ harm_intent_damage = 5 melee_damage_lower = 5 melee_damage_upper = 5 + retreat_distance = 10 + minimum_distance = 10 //AI artificers will flee like fuck attacktext = "rams" environment_smash = 2 attack_sound = 'sound/weapons/punch2.ogg' @@ -177,10 +186,52 @@ and, most important of all, create new constructs by producing soulstones to capture souls, \ and shells to place those soulstones into." +/mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here? + if(isliving(A)) + var/mob/living/L = A + if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health < L.maxHealth) //is this a hurt construct? let's go heal it if it is + return 1 + else + return 0 + else + return 0 + +/mob/living/simple_animal/hostile/construct/builder/CanAttack(atom/the_target) + if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it + return 0 + if(Found(the_target) || ..()) //If we Found it or Can_Attack it normally, we Can_Attack it as long as it wasn't invisible + return 1 //as a note this shouldn't be added to base hostile mobs because it'll mess up retaliate hostile mobs + +/mob/living/simple_animal/hostile/construct/builder/MoveToTarget(var/list/possible_targets) + ..() + if(target && isliving(target)) + var/mob/living/L = target + if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it + LoseTarget() + return 0 + if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you + retreat_distance = null + minimum_distance = 1 + +/mob/living/simple_animal/hostile/construct/builder/Aggro() + ..() + if(target && istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee + retreat_distance = null + minimum_distance = 1 + +/mob/living/simple_animal/hostile/construct/builder/LoseAggro() + ..() + retreat_distance = initial(retreat_distance) + minimum_distance = initial(minimum_distance) + +/mob/living/simple_animal/hostile/construct/builder/hostile //actually hostile, will move around, hit things, heal other constructs + AIStatus = AI_ON + environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP + /////////////////////////////Harvester///////////////////////// -/mob/living/simple_animal/construct/harvester +/mob/living/simple_animal/hostile/construct/harvester name = "Harvester" real_name = "Harvester" desc = "A long, thin construct built to herald Nar-Sie's rise. It'll be all over soon." @@ -190,9 +241,13 @@ health = 60 melee_damage_lower = 1 melee_damage_upper = 5 + retreat_distance = 2 //AI harvesters will move in and out of combat, like wraiths, but shittier attacktext = "prods" attack_sound = 'sound/weapons/tap.ogg' construct_spells = list(/obj/effect/proc_holder/spell/targeted/smoke/disable) playstyle_string = "You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \ Bring those who still cling to this world of illusion back to the Geometer so they may know Truth." +/mob/living/simple_animal/hostile/construct/harvester/hostile //actually hostile, will move around, hit things + AIStatus = AI_ON + diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 2b11da4eda2..9ea2a759b4c 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -221,10 +221,13 @@ /mob/living/simple_animal/hostile/proc/summon_backup(distance) do_alert_animation(src) playsound(loc, 'sound/machines/chime.ogg', 50, 1, -1) - for (var/mob/living/simple_animal/hostile/M in oview(distance, src)) + for(var/mob/living/simple_animal/hostile/M in oview(distance, src)) var/list/L = M.faction&faction if(L.len) - M.Goto(src,M.move_to_delay,M.minimum_distance) + if(M.AIStatus == AI_OFF) + return + else + M.Goto(src,M.move_to_delay,M.minimum_distance) /mob/living/simple_animal/hostile/proc/OpenFire(atom/A) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 404ccc92e8d..f4dc55f7dbf 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -536,7 +536,7 @@ if(!MP) return 0 //Sanity, this should never happen. - if(ispath(MP, /mob/living/simple_animal/construct)) + if(ispath(MP, /mob/living/simple_animal/hostile/construct)) return 0 //Verbs do not appear for players. //Good mobs! diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 78564886196..a7eb8fac14b 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -39,7 +39,7 @@ /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) - makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 0, loc_override = src.loc) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, null, 0, loc_override = src.loc) PoolOrNew(/obj/effect/particle_effect/smoke/sleeping, src.loc) From 953f175d2e77b0b903300033a8917eb4abae09e8 Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Sat, 5 Dec 2015 10:58:08 -0500 Subject: [PATCH 13/28] Hostile mobs don't get a target if the damage dealt is 0 or less. --- code/modules/mob/living/simple_animal/hostile/hostile.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 9ea2a759b4c..f4b2e6d4044 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -182,7 +182,7 @@ /mob/living/simple_animal/hostile/adjustBruteLoss(damage) ..(damage) - if(!ckey && !stat && search_objects < 3)//Not unconscious, and we don't ignore mobs + if(damage > 0 && !ckey && !stat && search_objects < 3)//Not unconscious, and we don't ignore mobs if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight search_objects = 0 target = null From 3c75d78f842f6c2dcd997007d8332d4ab7b2ae88 Mon Sep 17 00:00:00 2001 From: octareenroon91 Date: Sat, 5 Dec 2015 16:35:41 -0600 Subject: [PATCH 14/28] Use a list instead of net_id reduce excess calls to update_icon() --- .../objects/items/weapons/storage/wallets.dm | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 3822d76e497..ae160346292 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -30,35 +30,31 @@ slot_flags = SLOT_ID var/obj/item/weapon/card/id/front_id = null - var/obj/item/weapon/card/id/net_id = null + var/list/combined_access = list() -/obj/item/weapon/storage/wallet/New() - ..() - net_id = new /obj/item/weapon/card/id(src) - -/obj/item/weapon/storage/wallet/remove_from_storage(obj/item/W as obj, atom/new_location) +/obj/item/weapon/storage/wallet/remove_from_storage(obj/item/W, atom/new_location) . = ..(W, new_location) if(.) - if(W == front_id) - front_id = null if(istype(W, /obj/item/weapon/card/id)) + if(W == front_id) + front_id = null refreshID() update_icon() /obj/item/weapon/storage/wallet/proc/refreshID() - net_id.access.Cut() + combined_access.Cut() for(var/obj/item/weapon/card/id/I in contents) if(!front_id) front_id = I - net_id.access |= I.access // Merge access from any and all cards in wallet + update_icon() + combined_access |= I.access -/obj/item/weapon/storage/wallet/handle_item_insertion(obj/item/W as obj, prevent_warning = 0) +/obj/item/weapon/storage/wallet/handle_item_insertion(obj/item/W, prevent_warning = 0) . = ..(W, prevent_warning) if(.) if(istype(W, /obj/item/weapon/card/id)) refreshID() - update_icon() /obj/item/weapon/storage/wallet/update_icon() @@ -80,12 +76,11 @@ /obj/item/weapon/storage/wallet/GetID() - return front_id // net_id is only a holder for accesses. + return front_id -/obj/item/weapon/storage/wallet/GetAccess() - var/list/myaccess = net_id.GetAccess() // favor OOP by not using net_id.access directly. - if(myaccess.len) // is there any access to be had this way? - return myaccess +/obj/item/weapon/storage/wallet/GetAccess( + if(combined_access.len) + return combined_access else return ..() From a0b2b0a72113eaba91f59cdce76acbd18fdbe1c8 Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Sat, 5 Dec 2015 19:09:21 -0500 Subject: [PATCH 15/28] Couple of small fixes. thou shalt not flee the will of nar-sie --- code/game/gamemodes/wizard/soulstone.dm | 6 +++--- .../mob/living/simple_animal/constructs.dm | 16 ++++++++++------ .../mob/living/simple_animal/hostile/hostile.dm | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index ce0102d3448..eee99d5d765 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -171,13 +171,13 @@ return switch(construct_class) if("Juggernaut") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, A, user) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/armored, A, user, 0, T.loc) if("Wraith") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, A, user) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, A, user, 0, T.loc) if("Artificer") - makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, A, user) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder, A, user, 0, T.loc) qdel(T) qdel(src) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 5ce368910cc..d1c80d8bfaf 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -21,10 +21,11 @@ healable = 0 faction = list("cult") flying = 1 + pressure_resistance = 200 unique_name = 1 AIStatus = AI_OFF //normal constructs don't have AI var/list/construct_spells = list() - var/playstyle_string = "You are a generic construct! Your job is to not exist." + var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." /mob/living/simple_animal/hostile/construct/New() @@ -60,10 +61,10 @@ if(src != M) Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4) M.visible_message("[M] repairs some of \the [src]'s dents.", \ - "You repair some of [src]'s dents, leaving [src] at [health]/[maxHealth] health.") + "You repair some of [src]'s dents, leaving [src] at [health]/[maxHealth] health.") else M.visible_message("[M] repairs some of its own dents.", \ - "You repair some of your own dents, leaving you at [M.health]/[M.maxHealth] health.") + "You repair some of your own dents, leaving you at [M.health]/[M.maxHealth] health.") else if(src != M) M << "You cannot repair [src]'s dents, as it has none!" @@ -89,7 +90,7 @@ icon_living = "behemoth" maxHealth = 250 health = 250 - response_harm = "harmlessly punches" + response_harm = "harmlessly punches" harm_intent_damage = 0 melee_damage_lower = 30 melee_damage_upper = 30 @@ -243,11 +244,14 @@ melee_damage_upper = 5 retreat_distance = 2 //AI harvesters will move in and out of combat, like wraiths, but shittier attacktext = "prods" + environment_smash = 3 attack_sound = 'sound/weapons/tap.ogg' - construct_spells = list(/obj/effect/proc_holder/spell/targeted/smoke/disable) + construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall, + /obj/effect/proc_holder/spell/aoe_turf/conjure/floor. + /obj/effect/proc_holder/spell/targeted/smoke/disable) playstyle_string = "You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \ Bring those who still cling to this world of illusion back to the Geometer so they may know Truth." /mob/living/simple_animal/hostile/construct/harvester/hostile //actually hostile, will move around, hit things AIStatus = AI_ON - + environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index f4b2e6d4044..31ae1247d0a 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -182,7 +182,7 @@ /mob/living/simple_animal/hostile/adjustBruteLoss(damage) ..(damage) - if(damage > 0 && !ckey && !stat && search_objects < 3)//Not unconscious, and we don't ignore mobs + if(!ckey && !stat && search_objects < 3 && damage > 0)//Not unconscious, and we don't ignore mobs if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight search_objects = 0 target = null From b9bd386a3ee9342f1962833694850279362b8c62 Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Sat, 5 Dec 2015 19:18:58 -0500 Subject: [PATCH 16/28] coughing noise, comma comes out --- code/modules/mob/living/simple_animal/constructs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index d1c80d8bfaf..df423f61f0e 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -247,7 +247,7 @@ environment_smash = 3 attack_sound = 'sound/weapons/tap.ogg' construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall, - /obj/effect/proc_holder/spell/aoe_turf/conjure/floor. + /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, /obj/effect/proc_holder/spell/targeted/smoke/disable) playstyle_string = "You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \ Bring those who still cling to this world of illusion back to the Geometer so they may know Truth." From 9fa4288b0888996b999ee8f7a9249b32883bb3a6 Mon Sep 17 00:00:00 2001 From: MrStonedOne Date: Sat, 5 Dec 2015 16:40:52 -0800 Subject: [PATCH 17/28] Makes everything that used spawn () throw_at use throw_at_fast --- code/datums/spells/wizard.dm | 2 +- code/game/machinery/mass_driver.dm | 3 +-- code/game/mecha/equipment/weapons/weapons.dm | 3 +-- .../objects/items/weapons/pneumaticCannon.dm | 11 +++++------ .../food&drinks/kitchen machinery/gibber.dm | 2 +- code/modules/recycling/disposal-structures.dm | 12 +++--------- code/modules/recycling/disposal-unit.dm | 4 +--- code/modules/research/experimentor.dm | 17 +++++++---------- 8 files changed, 20 insertions(+), 34 deletions(-) diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index 87f896b3f55..f2e3e3a9c40 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -334,7 +334,7 @@ var/mob/living/M = AM M.Weaken(2) M << "You're thrown back by [user]!" - spawn(0) AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time. + AM.throw_at_fast(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time. /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno //i fixed conflicts only to find out that this is in the WIZARD file instead of the xeno file?! diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index cbae21bc11e..bb77e578741 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -26,8 +26,7 @@ audible_message("[src] lets out a screech, it doesn't seem to be able to handle the load.") break use_power(500) - spawn(0) - O.throw_at(target, drive_range * power, power) + O.throw_at_fast(target, drive_range * power, power) flick("mass_driver1", src) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index ae89085fdb2..855408d7461 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -285,8 +285,7 @@ log_message("Launched a [O.name] from [name], targeting [target].") projectiles-- proj_init(O) - spawn(0) - O.throw_at(target, missile_range, missile_speed, spin = 0) + O.throw_at_fast(target, missile_range, missile_speed, spin = 0) return 1 //used for projectile initilisation (priming flashbang) and additional logging diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 9b8516f8413..5d73339b164 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -116,12 +116,11 @@ add_logs(user, target, "fired at", src) playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 50, 1) for(var/obj/item/ITD in loadedItems) //Item To Discharge - spawn(0) - loadedItems.Remove(ITD) - loadedWeightClass -= ITD.w_class - ITD.throw_speed = pressureSetting * 2 - ITD.loc = get_turf(src) - ITD.throw_at(target, pressureSetting * 5, pressureSetting * 2,user) + loadedItems.Remove(ITD) + loadedWeightClass -= ITD.w_class + ITD.throw_speed = pressureSetting * 2 + ITD.loc = get_turf(src) + ITD.throw_at_fast(target, pressureSetting * 5, pressureSetting * 2,user) if(pressureSetting >= 3 && user) user.visible_message("[user] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!") user.Weaken(3) diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm index 1e796de56c0..79f11788a74 100644 --- a/code/modules/food&drinks/kitchen machinery/gibber.dm +++ b/code/modules/food&drinks/kitchen machinery/gibber.dm @@ -207,7 +207,7 @@ var/list/nearby_turfs = orange(3, get_turf(src)) var/obj/item/meatslab = allmeat[i] meatslab.loc = src.loc - meatslab.throw_at(pick(nearby_turfs),i,3) + meatslab.throw_at_fast(pick(nearby_turfs),i,3) for (var/turfs=1 to meat_produced*3) var/turf/gibturf = pick(nearby_turfs) if (!gibturf.density && src in viewers(gibturf)) diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index 7ea048f1bf3..24e12478be0 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -278,9 +278,7 @@ for(var/atom/movable/AM in H) AM.loc = T AM.pipe_eject(direction) - spawn(1) - if(AM) - AM.throw_at(target, 10, 1) + AM.throw_at_fast(target, 10, 1) else // no specified direction, so throw in random direction @@ -291,9 +289,7 @@ AM.loc = T AM.pipe_eject(0) - spawn(1) - if(AM) - AM.throw_at(target, 5, 1) + AM.throw_at_fast(target, 5, 1) H.vent_gas(T) qdel(H) return @@ -800,9 +796,7 @@ for(var/atom/movable/AM in H) AM.loc = src.loc AM.pipe_eject(dir) - spawn(5) - if(AM) - AM.throw_at(target, eject_range, 1) + AM.throw_at_fast(target, eject_range, 1) H.vent_gas(src.loc) qdel(H) return diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 74be5a2317d..ed95abc4232 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -258,9 +258,7 @@ AM.loc = src.loc AM.pipe_eject(0) - spawn(1) - if(AM) - AM.throw_at(target, 5, 1) + AM.throw_at_fast(target, 5, 1) H.vent_gas(loc) qdel(H) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 8b058c4096c..346264b7354 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -457,10 +457,9 @@ visible_message("[src]'s crusher goes way too many levels too high, crushing right through space-time!") playsound(src.loc, 'sound/effects/supermatter.ogg', 50, 1, -3) investigate_log("Experimentor has triggered the 'throw things' reaction.", "experimentor") - spawn(0) - for(var/atom/movable/AM in oview(7,src)) - if(!AM.anchored) - AM.throw_at(src,10,1) + for(var/atom/movable/AM in oview(7,src)) + if(!AM.anchored) + AM.throw_at_fast(src,10,1) if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message("[src]'s crusher goes one level too high, crushing right into space-time!") @@ -470,10 +469,9 @@ for(var/atom/movable/AM in oview(7,src)) if(!AM.anchored) throwAt.Add(AM) - spawn(0) - for(var/counter = 1, counter < throwAt.len, ++counter) - var/atom/movable/cast = throwAt[counter] - cast.throw_at(pick(throwAt),10,1) + for(var/counter = 1, counter < throwAt.len, ++counter) + var/atom/movable/cast = throwAt[counter] + cast.throw_at_fast(pick(throwAt),10,1) ejectItem(TRUE) //////////////////////////////////////////////////////////////////////////////////////////////// if(exp == FAIL) @@ -693,8 +691,7 @@ R.realProc = realProc R.revealed = TRUE dupes |= R - spawn() - R.throw_at(pick(oview(7,get_turf(src))),10,1) + R.throw_at_fast(pick(oview(7,get_turf(src))),10,1) counter = 0 spawn(rand(10,100)) for(counter = 1; counter <= dupes.len; counter++) From 5646f0eb5b57f0db30c6a1d3c21d4a0c2d6e917b Mon Sep 17 00:00:00 2001 From: octareenroon91 Date: Sat, 5 Dec 2015 18:42:50 -0600 Subject: [PATCH 18/28] syntax error --- code/game/objects/items/weapons/storage/wallets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index ae160346292..c7da0007656 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -78,7 +78,7 @@ /obj/item/weapon/storage/wallet/GetID() return front_id -/obj/item/weapon/storage/wallet/GetAccess( +/obj/item/weapon/storage/wallet/GetAccess() if(combined_access.len) return combined_access else From 45771e8a48c75b1fd8f134c752c4df3ff4dda519 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 6 Dec 2015 06:11:21 +0000 Subject: [PATCH 19/28] Automatic changelog generation for PR #13438 --- html/changelogs/AutoChangeLog-pr-13438.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13438.yml diff --git a/html/changelogs/AutoChangeLog-pr-13438.yml b/html/changelogs/AutoChangeLog-pr-13438.yml new file mode 100644 index 00000000000..4fd3e1acb47 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13438.yml @@ -0,0 +1,4 @@ +author: neersighted +delete-after: True +changes: + - bugfix: "Cryo now properly checks it is on before healing..." From a32f9134bb4509d85ce89f193d10033d81cd1169 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sun, 6 Dec 2015 06:19:58 +0000 Subject: [PATCH 20/28] Automatic changelog generation for PR #13401 --- html/changelogs/AutoChangeLog-pr-13401.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13401.yml diff --git a/html/changelogs/AutoChangeLog-pr-13401.yml b/html/changelogs/AutoChangeLog-pr-13401.yml new file mode 100644 index 00000000000..b76b8bdcb78 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13401.yml @@ -0,0 +1,5 @@ +author: Gun Hog +delete-after: True +changes: + - rscadd: "Nanotrasen is proud to announce that it has improved its Diagnostic HUD firmware to include the station's automated robot population! New features include integrity tracking, Off/On status, and mode tracking! If your little robot friend suddenly manages to acquire free will, you will be able to track that as well!" + - tweak: "Artificial Intelligence units may find that their bot management interface now shows when a robot gains free will. This is also displayed on the Personal Data Assistant's bot control interface." From 5a5a48f19af271f26f56f02bc3573418a266a9e6 Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Sun, 6 Dec 2015 06:24:20 +0000 Subject: [PATCH 21/28] Automatic changelog compile --- html/changelog.html | 11 +++++++++++ html/changelogs/.all_changelog.yml | 11 +++++++++++ html/changelogs/AutoChangeLog-pr-13401.yml | 5 ----- html/changelogs/AutoChangeLog-pr-13438.yml | 4 ---- 4 files changed, 22 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-13401.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13438.yml diff --git a/html/changelog.html b/html/changelog.html index a96327de807..955e462fd6c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,17 @@ -->
+

06 December 2015

+

Gun Hog updated:

+
    +
  • Nanotrasen is proud to announce that it has improved its Diagnostic HUD firmware to include the station's automated robot population! New features include integrity tracking, Off/On status, and mode tracking! If your little robot friend suddenly manages to acquire free will, you will be able to track that as well!
  • +
  • Artificial Intelligence units may find that their bot management interface now shows when a robot gains free will. This is also displayed on the Personal Data Assistant's bot control interface.
  • +
+

neersighted updated:

+
    +
  • Cryo now properly checks it is on before healing...
  • +
+

05 December 2015

Joan updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3c39d7beaed..f4b8852e6a1 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2740,3 +2740,14 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2015-12-05: Joan: - rscdel: Magic missiles no longer do damage. +2015-12-06: + Gun Hog: + - rscadd: Nanotrasen is proud to announce that it has improved its Diagnostic HUD + firmware to include the station's automated robot population! New features include + integrity tracking, Off/On status, and mode tracking! If your little robot friend + suddenly manages to acquire free will, you will be able to track that as well! + - tweak: Artificial Intelligence units may find that their bot management interface + now shows when a robot gains free will. This is also displayed on the Personal + Data Assistant's bot control interface. + neersighted: + - bugfix: Cryo now properly checks it is on before healing... diff --git a/html/changelogs/AutoChangeLog-pr-13401.yml b/html/changelogs/AutoChangeLog-pr-13401.yml deleted file mode 100644 index b76b8bdcb78..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13401.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Gun Hog -delete-after: True -changes: - - rscadd: "Nanotrasen is proud to announce that it has improved its Diagnostic HUD firmware to include the station's automated robot population! New features include integrity tracking, Off/On status, and mode tracking! If your little robot friend suddenly manages to acquire free will, you will be able to track that as well!" - - tweak: "Artificial Intelligence units may find that their bot management interface now shows when a robot gains free will. This is also displayed on the Personal Data Assistant's bot control interface." diff --git a/html/changelogs/AutoChangeLog-pr-13438.yml b/html/changelogs/AutoChangeLog-pr-13438.yml deleted file mode 100644 index 4fd3e1acb47..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13438.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: neersighted -delete-after: True -changes: - - bugfix: "Cryo now properly checks it is on before healing..." From d97bd880b9962e054a76d978ef2c1b609356ad0c Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sun, 6 Dec 2015 07:48:52 -0800 Subject: [PATCH 22/28] Fixes library computers pager...... 3rd time's the charm --- code/modules/library/lib_machines.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index d8f08e5eddb..acf47454271 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -316,7 +316,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums usr << browse(null, "window=library") onclose(usr, "library") return - if(href_list["page"] && screenstate == 4 && isnum(href_list["page"])) + if(href_list["page"] && screenstate == 4)) page = text2num(href_list["page"]) if(href_list["switchscreen"]) switch(href_list["switchscreen"]) From 0e4c9b79f3b927ec2fae84bd540830d204aef848 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sun, 6 Dec 2015 08:40:47 -0800 Subject: [PATCH 23/28] Update lib_machines.dm --- code/modules/library/lib_machines.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index acf47454271..ae9ec6cf95f 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -316,7 +316,7 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums usr << browse(null, "window=library") onclose(usr, "library") return - if(href_list["page"] && screenstate == 4)) + if(href_list["page"] && screenstate == 4) page = text2num(href_list["page"]) if(href_list["switchscreen"]) switch(href_list["switchscreen"]) From 0d55edc2b000cad42e6f203af1be4a256901fd09 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sun, 6 Dec 2015 12:20:12 -0800 Subject: [PATCH 24/28] Hot fix for stickybans going hey wire --- code/modules/admin/IsBanned.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 19eff86457e..c5284d25e95 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -4,6 +4,10 @@ if (!key || !address || !computer_id) log_access("Failed Login (invalid data): [key] [address]-[computer_id]") return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided invalid or blank information to the server on connection (byond username, IP, and Computer ID.) Provided information for reference: Username:'[key]' IP:'[address]' Computer ID:'[computer_id]'. (If you continue to get this error, please restart byond or contact byond support.)") + + if (computer_id == 2147783647) //this cid causes stickybans to go haywire + log_access("Failed Login (invalid cid): [key] [address]-[computer_id]") + return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.)") var/admin = 0 var/ckey = ckey(key) if((ckey in admin_datums) || (ckey in deadmins)) From 88a795a0c68d4bf7dffd96f9d7628efdf1d0fbef Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sun, 6 Dec 2015 12:54:36 -0800 Subject: [PATCH 25/28] fixes typo in is banned() --- code/modules/admin/IsBanned.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index c5284d25e95..4b468866d9f 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -5,7 +5,7 @@ log_access("Failed Login (invalid data): [key] [address]-[computer_id]") return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided invalid or blank information to the server on connection (byond username, IP, and Computer ID.) Provided information for reference: Username:'[key]' IP:'[address]' Computer ID:'[computer_id]'. (If you continue to get this error, please restart byond or contact byond support.)") - if (computer_id == 2147783647) //this cid causes stickybans to go haywire + if (computer_id == 2147483647) //this cid causes stickybans to go haywire log_access("Failed Login (invalid cid): [key] [address]-[computer_id]") return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.)") var/admin = 0 From 01b12caec8e9c67aa9463e374171bfbfc228734b Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Sun, 6 Dec 2015 17:41:27 -0500 Subject: [PATCH 26/28] obey the dunc --- code/modules/mob/living/simple_animal/constructs.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index df423f61f0e..ee584f7cbbe 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -188,9 +188,9 @@ and shells to place those soulstones into." /mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here? - if(isliving(A)) - var/mob/living/L = A - if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health < L.maxHealth) //is this a hurt construct? let's go heal it if it is + if(istype(A, /mob/living/simple_animal/hostile/construct)) //is it a construct? + var/mob/living/simple_animal/hostile/construct/C = A + if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is return 1 else return 0 @@ -205,7 +205,7 @@ /mob/living/simple_animal/hostile/construct/builder/MoveToTarget(var/list/possible_targets) ..() - if(target && isliving(target)) + if(isliving(target)) var/mob/living/L = target if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it LoseTarget() @@ -216,7 +216,7 @@ /mob/living/simple_animal/hostile/construct/builder/Aggro() ..() - if(target && istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee + if(istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee retreat_distance = null minimum_distance = 1 From e640b4263a0d193765febe4786b0bdf726c1932a Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 7 Dec 2015 17:37:46 +0000 Subject: [PATCH 27/28] Automatic changelog generation for PR #13440 --- html/changelogs/AutoChangeLog-pr-13440.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13440.yml diff --git a/html/changelogs/AutoChangeLog-pr-13440.yml b/html/changelogs/AutoChangeLog-pr-13440.yml new file mode 100644 index 00000000000..62d4f813255 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13440.yml @@ -0,0 +1,6 @@ +author: octareenroon91 +delete-after: True +changes: + - rscadd: "Wallets now use the access of all IDs stored inside them." + - rscadd: "As the accesses of all IDs are merged, two IDs in a wallet may grant access to a door that neither one alone would open." + - bugfix: "Wallets used to be useless for access if the first ID card put into it was taken out, until another ID card was put back in. That should not happen anymore." From 53ffce76c457cf8bf8061c91ab985c54a346201a Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Mon, 7 Dec 2015 17:45:00 +0000 Subject: [PATCH 28/28] Automatic changelog compile --- html/changelog.html | 8 ++++++++ html/changelogs/.all_changelog.yml | 8 ++++++++ html/changelogs/AutoChangeLog-pr-13440.yml | 6 ------ 3 files changed, 16 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-13440.yml diff --git a/html/changelog.html b/html/changelog.html index 955e462fd6c..50b532f92ee 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,14 @@ -->
    +

    07 December 2015

    +

    octareenroon91 updated:

    +
      +
    • Wallets now use the access of all IDs stored inside them.
    • +
    • As the accesses of all IDs are merged, two IDs in a wallet may grant access to a door that neither one alone would open.
    • +
    • Wallets used to be useless for access if the first ID card put into it was taken out, until another ID card was put back in. That should not happen anymore.
    • +
    +

    06 December 2015

    Gun Hog updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f4b8852e6a1..72baf0b9694 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2751,3 +2751,11 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Data Assistant's bot control interface. neersighted: - bugfix: Cryo now properly checks it is on before healing... +2015-12-07: + octareenroon91: + - rscadd: Wallets now use the access of all IDs stored inside them. + - rscadd: As the accesses of all IDs are merged, two IDs in a wallet may grant access + to a door that neither one alone would open. + - bugfix: Wallets used to be useless for access if the first ID card put into it + was taken out, until another ID card was put back in. That should not happen + anymore. diff --git a/html/changelogs/AutoChangeLog-pr-13440.yml b/html/changelogs/AutoChangeLog-pr-13440.yml deleted file mode 100644 index 62d4f813255..00000000000 --- a/html/changelogs/AutoChangeLog-pr-13440.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: octareenroon91 -delete-after: True -changes: - - rscadd: "Wallets now use the access of all IDs stored inside them." - - rscadd: "As the accesses of all IDs are merged, two IDs in a wallet may grant access to a door that neither one alone would open." - - bugfix: "Wallets used to be useless for access if the first ID card put into it was taken out, until another ID card was put back in. That should not happen anymore."

Name

Status

Location

Control

[Bot.hacked ? "(!)" : ""] [Bot.name] ([Bot.model])
[Bot.hacked ? "(!)" : ""] [Bot.name] ([Bot.model])[Bot.on ? "[Bot.mode ? "[ Bot.get_mode() ]": "Idle"]" : "Inactive"][bot_mode][bot_area.name]InterfaceCall