12/21 modernizations from TG live (#103)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes
This commit is contained in:
Poojawa
2016-12-22 03:57:55 -06:00
committed by GitHub
parent f5e143a452
commit cf59ac1c3d
2215 changed files with 707445 additions and 87041 deletions
@@ -4,12 +4,14 @@
/mob/living/simple_animal/bot
icon = 'icons/obj/aibots.dmi'
layer = MOB_LAYER
gender = NEUTER
luminosity = 3
stop_automated_movement = 1
wander = 0
healable = 0
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)
maxbodytemp = INFINITY
minbodytemp = 0
has_unlimited_silicon_privilege = 1
sentience_type = SENTIENCE_ARTIFICIAL
@@ -20,7 +22,7 @@
verb_yell = "alarms"
bubble_icon = "machine"
faction = list("neutral", "silicon")
faction = list("neutral", "silicon" , "turret")
var/obj/machinery/bot_core/bot_core = null
var/bot_core_type = /obj/machinery/bot_core
@@ -101,14 +103,14 @@
if(stat)
return 0
on = 1
set_light(initial(luminosity))
SetLuminosity(initial(luminosity))
update_icon()
diag_hud_set_botstat()
return 1
/mob/living/simple_animal/bot/proc/turn_off()
on = 0
set_light(0)
SetLuminosity(0)
bot_reset() //Resets an AI's call, should it exist.
update_icon()
@@ -224,7 +226,7 @@
/mob/living/simple_animal/bot/attack_hand(mob/living/carbon/human/H)
if(H.a_intent == "help")
if(H.a_intent == INTENT_HELP)
interact(H)
else
return ..()
@@ -269,7 +271,7 @@
ejectpai(user)
else
user.changeNext_move(CLICK_CD_MELEE)
if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm")
if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM)
if(health >= maxHealth)
user << "<span class='warning'>[src] does not need a repair!</span>"
return
@@ -857,7 +859,7 @@ Pass a positive integer as an argument to override a bot's default speed.
src << "<span class='notice'>You sense your form change as you are uploaded into [src].</span>"
bot_name = name
name = paicard.pai.name
faction = user.faction
faction = user.faction.Copy()
add_logs(user, paicard.pai, "uploaded to [bot_name],")
return 1
else
@@ -98,7 +98,7 @@
return
if(emagged == 2) //Emag functions
if(istype(loc, /turf/open))
if(isopenturf(loc))
for(var/mob/living/carbon/victim in loc)
if(victim != target)
@@ -170,7 +170,7 @@
/obj/effect/decal/cleanable/vomit,
/obj/effect/decal/cleanable/robot_debris,
/obj/effect/decal/cleanable/crayon,
/obj/effect/decal/cleanable/molten_item,
/obj/effect/decal/cleanable/molten_object,
/obj/effect/decal/cleanable/tomato_smudge,
/obj/effect/decal/cleanable/egg_smudge,
/obj/effect/decal/cleanable/pie_smudge,
@@ -217,7 +217,7 @@
else if(istype(A, /mob/living/simple_animal/cockroach) || istype(A, /mob/living/simple_animal/mouse))
var/mob/living/simple_animal/M = target
if(!M.stat)
visible_message("<span class='danger'>[src] smashes [target] with it's mop!</span>")
visible_message("<span class='danger'>[src] smashes [target] with its mop!</span>")
M.death()
target = null
@@ -257,7 +257,7 @@
new /obj/item/device/assembly/prox_sensor(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
new /obj/item/bodypart/l_arm/robot(Tsec)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
@@ -10,12 +10,12 @@
throwforce = 5
throw_speed = 2
throw_range = 5
w_class = 3.
w_class = WEIGHT_CLASS_NORMAL
var/created_name = "Cleanbot"
/obj/item/weapon/bucket_sensor/attackby(obj/item/W, mob/user as mob, params)
..()
if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm))
if(istype(W, /obj/item/bodypart/l_arm/robot) || istype(W, /obj/item/bodypart/r_arm/robot))
if(!user.unEquip(W))
return
qdel(W)
@@ -60,7 +60,7 @@
switch(build_step)
if(0,1)
if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg))
if(istype(W, /obj/item/bodypart/l_leg/robot) || istype(W, /obj/item/bodypart/r_leg/robot))
if(!user.unEquip(W))
return
qdel(W)
@@ -158,7 +158,7 @@
return
newname = "redtag ED-209 assembly"
if("")
if(!istype(W, /obj/item/weapon/gun/energy/gun/advtaser))
if(!istype(W, /obj/item/weapon/gun/energy/e_gun/advtaser))
return
newname = "taser ED-209 assembly"
else
@@ -205,7 +205,7 @@
throwforce = 10
throw_speed = 2
throw_range = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
var/created_name = "Floorbot"
/obj/item/weapon/toolbox_tiles_sensor
@@ -217,7 +217,7 @@
throwforce = 10
throw_speed = 2
throw_range = 5
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
var/created_name = "Floorbot"
/obj/item/weapon/storage/toolbox/mechanical/attackby(obj/item/stack/tile/plasteel/T, mob/user, params)
@@ -261,7 +261,7 @@
/obj/item/weapon/toolbox_tiles_sensor/attackby(obj/item/W, mob/user, params)
..()
if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm))
if(istype(W, /obj/item/bodypart/l_arm/robot) || istype(W, /obj/item/bodypart/r_arm/robot))
qdel(W)
var/turf/T = get_turf(user.loc)
var/mob/living/simple_animal/bot/floorbot/A = new /mob/living/simple_animal/bot/floorbot(T)
@@ -287,7 +287,7 @@
var/build_step = 0
var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess
var/skin = null //Same as medbot, set to tox or ointment for the respective kits.
w_class = 3
w_class = WEIGHT_CLASS_NORMAL
/obj/item/weapon/firstaid_arm_assembly/New()
..()
@@ -295,11 +295,10 @@
if(skin)
add_overlay(image('icons/obj/aibots.dmi', "kit_skin_[skin]"))
/obj/item/weapon/storage/firstaid/attackby(obj/item/robot_parts/S, mob/user, params)
/obj/item/weapon/storage/firstaid/attackby(obj/item/bodypart/S, mob/user, params)
if((!istype(S, /obj/item/robot_parts/l_arm)) && (!istype(S, /obj/item/robot_parts/r_arm)))
..()
return
if((!istype(S, /obj/item/bodypart/l_arm/robot)) && (!istype(S, /obj/item/bodypart/r_arm/robot)))
return ..()
//Making a medibot!
if(contents.len >= 1)
@@ -416,7 +415,7 @@
name = "helmet/signaler/prox sensor assembly"
qdel(I)
else if(((istype(I, /obj/item/robot_parts/l_arm)) || (istype(I, /obj/item/robot_parts/r_arm))) && (build_step == 2))
else if(((istype(I, /obj/item/bodypart/l_arm/robot)) || (istype(I, /obj/item/bodypart/r_arm/robot))) && (build_step == 2))
if(!user.unEquip(I))
return
build_step++
@@ -459,6 +458,6 @@
else if(build_step == 3)
overlays -= "hs_arm"
new /obj/item/robot_parts/l_arm(get_turf(src))
new /obj/item/bodypart/l_arm/robot(get_turf(src))
user << "<span class='notice'>You remove the robot arm from [src].</span>"
build_step--
build_step--
@@ -8,7 +8,7 @@
health = 100
maxHealth = 100
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
obj_damage = 60
environment_smash = 2 //Walls can't stop THE LAW
mob_size = MOB_SIZE_LARGE
@@ -23,7 +23,7 @@
data_hud_type = DATA_HUD_SECURITY_ADVANCED
var/lastfired = 0
var/shot_delay = 3 //.3 seconds between shots
var/shot_delay = 15
var/lasercolor = ""
var/disabled = 0//A holder for if it needs to be disabled, if true it will not seach for targets, shoot at targets, or move, currently only used for lasertag
@@ -126,7 +126,7 @@ Auto Patrol[]"},
return dat
/mob/living/simple_animal/bot/ed209/Topic(href, href_list)
if(lasercolor && (istype(usr,/mob/living/carbon/human)))
if(lasercolor && ishuman(usr))
var/mob/living/carbon/human/H = usr
if((lasercolor == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag)))//Opposing team cannot operate it
return
@@ -160,13 +160,13 @@ Auto Patrol[]"},
mode = BOT_HUNT
/mob/living/simple_animal/bot/ed209/attack_hand(mob/living/carbon/human/H)
if(H.a_intent == "harm")
if(H.a_intent == INTENT_HARM)
retaliate(H)
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.
if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
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.
@@ -337,7 +337,7 @@ Auto Patrol[]"},
target = C
oldtarget_name = C.name
speak("Level [threatlevel] infraction alert!")
playsound(loc, pick('sound/voice/ed209_growl.ogg', 'sound/voice/ed209_20seconds.ogg'), 50, 0)
playsound(loc, pick('sound/voice/ed209_20sec.ogg', 'sound/voice/EDPlaceholder.ogg'), 50, 0)
visible_message("<b>[src]</b> points at [C.name]!")
mode = BOT_HUNT
spawn(0)
@@ -363,7 +363,7 @@ Auto Patrol[]"},
new /obj/item/device/assembly/prox_sensor(Tsec)
if(!lasercolor)
var/obj/item/weapon/gun/energy/gun/advtaser/G = new /obj/item/weapon/gun/energy/gun/advtaser(Tsec)
var/obj/item/weapon/gun/energy/e_gun/advtaser/G = new /obj/item/weapon/gun/energy/e_gun/advtaser(Tsec)
G.power_supply.charge = 0
G.update_icon()
else if(lasercolor == "b")
@@ -376,9 +376,9 @@ Auto Patrol[]"},
G.update_icon()
if(prob(50))
new /obj/item/robot_parts/l_leg(Tsec)
new /obj/item/bodypart/l_leg/robot(Tsec)
if(prob(25))
new /obj/item/robot_parts/r_leg(Tsec)
new /obj/item/bodypart/r_leg/robot(Tsec)
if(prob(25))//50% chance for a helmet OR vest
if(prob(50))
new /obj/item/clothing/head/helmet(Tsec)
@@ -418,19 +418,15 @@ Auto Patrol[]"},
return
lastfired = world.time
var/turf/T = loc
var/atom/U = (istype(target, /atom/movable) ? target.loc : target)
if((!( U ) || !( T )))
var/turf/U = get_turf(target)
if(!U)
return
while(!(istype(U, /turf)))
U = U.loc
if(!(istype(T, /turf)))
if(!isturf(T))
return
if(!projectile)
return
if(!(istype(U, /turf)))
return
var/obj/item/projectile/A = new projectile (loc)
playsound(loc, shoot_sound, 50, 1)
A.current = U
@@ -528,16 +524,12 @@ Auto Patrol[]"},
spawn(2)
icon_state = "[lasercolor]ed209[on]"
var/threat = 5
if(istype(C, /mob/living/carbon/human))
C.stuttering = 5
C.Stun(5)
C.Weaken(5)
C.Weaken(5)
C.Stun(5)
C.stuttering = 5
if(ishuman(C))
var/mob/living/carbon/human/H = C
threat = H.assess_threat(src)
else
C.Weaken(5)
C.stuttering = 5
C.Stun(5)
add_logs(src,C,"stunned")
if(declare_arrests)
var/area/location = get_area(src)
@@ -187,10 +187,10 @@
if(!target && emagged < 2)
if(targetdirection != null) //The bot is in line mode.
var/turf/T = get_step(src, targetdirection)
if(istype(T, /turf/open/space)) //Check for space
if(isspaceturf(T)) //Check for space
target = T
process_type = LINE_SPACE_MODE
if(istype(T, /turf/open/floor)) //Check for floor
if(isfloorturf(T)) //Check for floor
target = T
if(!target)
@@ -225,7 +225,7 @@
if(target)
if(path.len == 0)
if(!istype(target, /turf/))
if(!isturf(target))
var/turf/TL = get_turf(target)
path = get_path_to(src, TL, /turf/proc/Distance_cardinal, 0, 30, id=access_card,simulated_only = 0)
else
@@ -248,9 +248,9 @@
target = null
path = list()
return
if(istype(target, /turf/) && emagged < 2)
if(isturf(target) && emagged < 2)
repair(target)
else if(emagged == 2 && istype(target,/turf/open/floor))
else if(emagged == 2 && isfloorturf(target))
var/turf/open/floor/F = target
anchored = 1
mode = BOT_REPAIRING
@@ -291,7 +291,7 @@
result = F
if(REPLACE_TILE)
F = scan_target
if(istype(F, /turf/open/floor) && !istype(F, /turf/open/floor/plating)) //The floor must already have a tile.
if(isfloorturf(F) && !istype(F, /turf/open/floor/plating)) //The floor must already have a tile.
result = F
if(FIX_TILE) //Selects only damaged floors.
F = scan_target
@@ -307,14 +307,14 @@
/mob/living/simple_animal/bot/floorbot/proc/repair(turf/target_turf)
if(istype(target_turf, /turf/open/space/))
if(isspaceturf(target_turf))
//Must be a hull breach or in line mode to continue.
if(!is_hull_breach(target_turf) && !targetdirection)
target = null
return
else if(!istype(target_turf, /turf/open/floor))
else if(!isfloorturf(target_turf))
return
if(istype(target_turf, /turf/open/space/)) //If we are fixing an area not part of pure space, it is
if(isspaceturf(target_turf)) //If we are fixing an area not part of pure space, it is
anchored = 1
icon_state = "floorbot-c"
visible_message("<span class='notice'>[targetdirection ? "[src] begins installing a bridge plating." : "[src] begins to repair the hole."] </span>")
@@ -376,7 +376,7 @@
empty_tiles()
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
new /obj/item/bodypart/l_arm/robot(Tsec)
var/obj/item/stack/tile/plasteel/T = new (Tsec)
T.amount = 1
@@ -38,10 +38,15 @@
var/declare_cooldown = 0 //Prevents spam of critical patient alerts.
var/stationary_mode = 0 //If enabled, the Medibot will not move automatically.
//Setting which reagents to use to treat what by default. By id.
var/treatment_brute_avoid = "tricordrazine"
var/treatment_brute = "bicaridine"
var/treatment_oxy_avoid = null
var/treatment_oxy = "dexalin"
var/treatment_fire_avoid = "tricordrazine"
var/treatment_fire = "kelotane"
var/treatment_tox = "antitoxin"
var/treatment_tox_avoid = "tricordrazine"
var/treatment_tox = "charcoal"
var/treatment_virus_avoid = null
var/treatment_virus = "spaceacillin"
var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible.
var/shut_up = 0 //self explanatory :)
@@ -50,7 +55,6 @@
name = "\improper Mysterious Medibot"
desc = "International Medibot of mystery."
skin = "bezerk"
treatment_oxy = "tricordrazine"
treatment_brute = "tricordrazine"
treatment_fire = "tricordrazine"
treatment_tox = "tricordrazine"
@@ -62,8 +66,11 @@
heal_threshold = 0
declare_crit = 0
treatment_oxy = "pancuronium"
treatment_brute_avoid = null
treatment_brute = "pancuronium"
treatment_fire_avoid = null
treatment_fire = "sodium_thiopental"
treatment_tox_avoid = null
treatment_tox = "sodium_thiopental"
/mob/living/simple_animal/bot/medbot/update_icon()
@@ -242,8 +249,10 @@
if(assess_patient(H))
last_found = world.time
if((last_newpatient_speak + 300) < world.time) //Don't spam these messages!
var/message = pick("Hey, [H.name]! Hold on, I'm coming.","Wait [H.name]! I want to help!","[H.name], you appear to be injured!")
var/list/messagevoice = list("Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/mcoming.ogg',"Wait [H.name]! I want to help!" = 'sound/voice/mhelp.ogg',"[H.name], you appear to be injured!" = 'sound/voice/minjured.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(loc, messagevoice[message], 50, 0)
last_newpatient_speak = world.time
return H
else
@@ -275,8 +284,10 @@
if(!patient)
if(!shut_up && prob(1))
var/message = pick("Radar, put a mask on!","There's always a catch, and it's the best there is.","I knew it, I should've been a plastic surgeon.","What kind of medbay is this? Everyone's dropping like dead flies.","Delicious!")
var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/mradar.ogg',"There's always a catch, and I'm the best there is." = 'sound/voice/mcatch.ogg',"I knew it, I should've been a plastic surgeon." = 'sound/voice/msurgeon.ogg',"What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/mflies.ogg',"Delicious!" = 'sound/voice/mdelicious.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(loc, messagevoice[message], 50, 0)
var/scan_range = (stationary_mode ? 1 : DEFAULT_SCAN_RANGE) //If in stationary mode, scan range is limited to adjacent patients.
patient = scan(/mob/living/carbon/human, oldpatient, scan_range)
oldpatient = patient
@@ -346,29 +357,25 @@
return 1
//They're injured enough for it!
if((C.getBruteLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_brute)))
if((!C.reagents.has_reagent(treatment_brute_avoid)) && (C.getBruteLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_brute)))
return 1 //If they're already medicated don't bother!
if((C.getOxyLoss() >= (15 + heal_threshold)) && (!C.reagents.has_reagent(treatment_oxy)))
if((!C.reagents.has_reagent(treatment_oxy_avoid)) && (C.getOxyLoss() >= (15 + heal_threshold)) && (!C.reagents.has_reagent(treatment_oxy)))
return 1
if((C.getFireLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_fire)))
if((!C.reagents.has_reagent(treatment_fire_avoid)) && (C.getFireLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_fire)))
return 1
if((C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_tox)))
if((!C.reagents.has_reagent(treatment_tox_avoid)) && (C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_tox)))
return 1
if(treat_virus)
if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus))
for(var/datum/disease/D in C.viruses)
//the medibot can't detect viruses that are undetectable to Health Analyzers or Pandemic machines.
if(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC)
return 0
if(D.severity == NONTHREAT) // medibot doesn't try to heal truly harmless viruses
return 0
if((D.stage > 1) || (D.spread_flags & AIRBORNE)) // medibot can't detect a virus in its initial stage unless it spreads airborne.
if(!C.reagents.has_reagent(treatment_virus))
return 1 //STOP DISEASE FOREVER
if(!(D.visibility_flags & HIDDEN_SCANNER || D.visibility_flags & HIDDEN_PANDEMIC) \
&& D.severity != NONTHREAT \
&& (D.stage > 1 || (D.spread_flags & AIRBORNE))) // medibot can't detect a virus in its initial stage unless it spreads airborne.
return 1 //STOP DISEASE FOREVER
return 0
@@ -398,8 +405,10 @@
return
if(C.stat == 2)
var/death_message = pick("No! NO!","Live, damnit! LIVE!","I...I've never lost a patient before. Not today, I mean.")
speak(death_message)
var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/mno.ogg',"Live, damnit! LIVE!" = 'sound/voice/mlive.ogg',"I...I've never lost a patient before. Not today, I mean." = 'sound/voice/mlost.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(loc, messagevoice[message], 50, 0)
oldpatient = patient
soft_reset()
return
@@ -420,23 +429,23 @@
virus = 1
if(!reagent_id && (virus))
if(!C.reagents.has_reagent(treatment_virus))
if(!C.reagents.has_reagent(treatment_virus) && !C.reagents.has_reagent(treatment_virus_avoid))
reagent_id = treatment_virus
if(!reagent_id && (C.getBruteLoss() >= heal_threshold))
if(!C.reagents.has_reagent(treatment_brute))
if(!C.reagents.has_reagent(treatment_brute) && !C.reagents.has_reagent(treatment_brute_avoid))
reagent_id = treatment_brute
if(!reagent_id && (C.getOxyLoss() >= (15 + heal_threshold)))
if(!C.reagents.has_reagent(treatment_oxy))
if(!C.reagents.has_reagent(treatment_oxy) && !C.reagents.has_reagent(treatment_oxy_avoid))
reagent_id = treatment_oxy
if(!reagent_id && (C.getFireLoss() >= heal_threshold))
if(!C.reagents.has_reagent(treatment_fire))
if(!C.reagents.has_reagent(treatment_fire) && !C.reagents.has_reagent(treatment_fire_avoid))
reagent_id = treatment_fire
if(!reagent_id && (C.getToxLoss() >= heal_threshold))
if(!C.reagents.has_reagent(treatment_tox))
if(!C.reagents.has_reagent(treatment_tox) && !C.reagents.has_reagent(treatment_tox_avoid))
reagent_id = treatment_tox
//If the patient is injured but doesn't have our special reagent in them then we should give it to them first
@@ -447,8 +456,10 @@
break
if(!reagent_id) //If they don't need any of that they're probably cured!
var/message = pick("All patched up!","An apple a day keeps me away.","Feel better soon!")
var/list/messagevoice = list("All patched up!" = 'sound/voice/mpatchedup.ogg',"An apple a day keeps me away." = 'sound/voice/mapple.ogg',"Feel better soon!" = 'sound/voice/mfeelbetter.ogg')
var/message = pick(messagevoice)
speak(message)
playsound(loc, messagevoice[message], 50, 0)
bot_reset()
return
else
@@ -458,7 +469,8 @@
C.visible_message("<span class='danger'>[src] is trying to inject [patient]!</span>", \
"<span class='userdanger'>[src] is trying to inject you!</span>")
spawn(30)//replace with do mob
var/failed = FALSE;
if(do_mob(src, patient, 30)) //Is C == patient? This is so confusing
if((get_dist(src, patient) <= 1) && (on) && assess_patient(patient))
if(reagent_id == "internal_beaker")
if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
@@ -470,16 +482,23 @@
C.visible_message("<span class='danger'>[src] injects [patient] with its syringe!</span>", \
"<span class='userdanger'>[src] injects you with its syringe!</span>")
else
visible_message("[src] retracts its syringe.")
update_icon()
soft_reset()
return
failed = TRUE
else
failed = TRUE
if(failed)
visible_message("[src] retracts its syringe.")
update_icon()
soft_reset()
return
reagent_id = null
return
/mob/living/simple_animal/bot/medbot/proc/check_overdose(mob/living/carbon/patient,reagent_id,injection_amount)
var/datum/reagent/R = chemical_reagents_list[reagent_id]
if(!R.overdose_threshold) //Some chems do not have an OD threshold
return 0
var/current_volume = patient.reagents.get_reagent_amount(reagent_id)
if(current_volume + injection_amount > R.overdose_threshold)
return 1
@@ -506,7 +525,10 @@
reagent_glass = null
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
new /obj/item/bodypart/l_arm/robot(Tsec)
if(emagged && prob(25))
playsound(loc, 'sound/voice/minsult.ogg', 50, 0)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
@@ -1,4 +1,4 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
// Mulebot - carries crates around for Quartermaster
// Navigates via floor navbeacons
@@ -20,7 +20,7 @@ var/global/mulebot_count = 0
health = 50
maxHealth = 50
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
a_intent = "harm" //No swapping
a_intent = INTENT_HARM //No swapping
buckle_lying = 0
mob_size = MOB_SIZE_LARGE
@@ -157,10 +157,10 @@ var/global/mulebot_count = 0
wires.cut_random()
/mob/living/simple_animal/bot/mulebot/interact(mob/user)
if(open && !istype(user, /mob/living/silicon/ai))
if(open && !isAI(user))
wires.interact(user)
else
if(wires.is_cut(WIRE_RX) && istype(user, /mob/living/silicon/ai))
if(wires.is_cut(WIRE_RX) && isAI(user))
return
ui_interact(user)
@@ -408,6 +408,7 @@ var/global/mulebot_count = 0
load.loc = loc
load.pixel_y = initial(load.pixel_y)
load.layer = initial(load.layer)
load.plane = initial(load.plane)
if(dirn)
var/turf/T = loc
var/turf/newT = get_step(T,dirn)
@@ -474,12 +475,13 @@ var/global/mulebot_count = 0
if(next == loc)
path -= next
return
if(istype( next, /turf))
if(isturf(next))
//world << "at ([x],[y]) moving to ([next.x],[next.y])"
if(bloodiness)
var/obj/effect/decal/cleanable/blood/tracks/B = new(loc)
B.blood_DNA |= blood_DNA.Copy()
if(blood_DNA && blood_DNA.len)
B.blood_DNA |= blood_DNA.Copy()
var/newdir = get_dir(next, loc)
if(newdir == dir)
B.setDir(newdir)
@@ -636,7 +638,7 @@ var/global/mulebot_count = 0
if(wires.is_cut(WIRE_AVOIDANCE)) // usually just bumps, but if avoidance disabled knock over mobs
var/mob/M = obs
if(ismob(M))
if(istype(M,/mob/living/silicon/robot))
if(iscyborg(M))
visible_message("<span class='danger'>[src] bumps into [M]!</span>")
else
if(!paicard)
@@ -665,6 +667,10 @@ var/global/mulebot_count = 0
var/turf/T = get_turf(src)
T.add_mob_blood(H)
var/list/blood_dna = H.get_blood_dna_list()
if(blood_dna)
transfer_blood_dna(blood_dna)
bloodiness += 4
// player on mulebot attempted to move
@@ -738,7 +744,7 @@ var/global/mulebot_count = 0
unload(get_dir(loc, A))
else
..()
/mob/living/simple_animal/bot/mulebot/insertpai(mob/user, obj/item/device/paicard/card)
if(..())
visible_message("[src] safeties are locked on.")
@@ -144,13 +144,13 @@ Auto Patrol: []"},
mode = BOT_HUNT
/mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/H)
if(H.a_intent == "harm")
if(H.a_intent == INTENT_HARM)
retaliate(H)
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.
if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent != 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.
retaliate(user)
@@ -189,7 +189,7 @@ Auto Patrol: []"},
/mob/living/simple_animal/bot/secbot/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0)
if(istype(AM, /obj/item))
var/obj/item/I = AM
if(I.throwforce < src.health && I.thrownby && (istype(I.thrownby, /mob/living/carbon/human)))
if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby))
var/mob/living/carbon/human/H = I.thrownby
retaliate(H)
..()
@@ -215,7 +215,7 @@ Auto Patrol: []"},
spawn(2)
icon_state = "secbot[on]"
var/threat = 5
if(istype(C, /mob/living/carbon/human))
if(ishuman(C))
C.stuttering = 5
C.Stun(5)
C.Weaken(5)
@@ -383,7 +383,7 @@ Auto Patrol: []"},
new /obj/item/weapon/melee/baton(Tsec)
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
new /obj/item/bodypart/l_arm/robot(Tsec)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)