Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into station_traits
This commit is contained in:
@@ -7,7 +7,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
|
||||
move_resist = INFINITY
|
||||
throwforce = 0
|
||||
|
||||
/mob/dead/Initialize()
|
||||
/mob/dead/Initialize(mapload)
|
||||
SHOULD_CALL_PARENT(FALSE)
|
||||
if(flags_1 & INITIALIZED_1)
|
||||
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
||||
@@ -121,6 +121,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
|
||||
if (isturf(T))
|
||||
update_z(T.z)
|
||||
|
||||
/mob/dead/auto_deadmin_on_login()
|
||||
return
|
||||
|
||||
/mob/dead/Logout()
|
||||
update_z(null)
|
||||
return ..()
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
//is there a result we want to read from the age gate
|
||||
var/age_gate_result
|
||||
|
||||
/mob/dead/new_player/Initialize()
|
||||
/mob/dead/new_player/Initialize(mapload)
|
||||
if(client && SSticker.state == GAME_STATE_STARTUP)
|
||||
var/atom/movable/screen/splash/S = new(client, TRUE, TRUE)
|
||||
S.Fade(TRUE)
|
||||
@@ -762,7 +762,7 @@
|
||||
|
||||
client.prefs.scars_list["[cur_scar_index]"] = valid_scars
|
||||
client.prefs.save_character()
|
||||
|
||||
|
||||
client.prefs.copy_to(H, initial_spawn = TRUE)
|
||||
H.dna.update_dna_identity()
|
||||
if(mind)
|
||||
|
||||
@@ -166,9 +166,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
||||
QDEL_NULL(spawners_menu)
|
||||
return ..()
|
||||
|
||||
/mob/dead/CanPass(atom/movable/mover, turf/target)
|
||||
return 1
|
||||
|
||||
/*
|
||||
* This proc will update the icon of the ghost itself, with hair overlays, as well as the ghost image.
|
||||
* Please call update_icon(icon_state) from now on when you want to update the icon_state of the ghost,
|
||||
|
||||
@@ -461,7 +461,7 @@
|
||||
//any cost it has isn't a worry
|
||||
/mob/proc/change_number_of_hands(amt)
|
||||
if(amt < held_items.len)
|
||||
for(var/i in held_items.len to amt step -1)
|
||||
for(var/i in held_items.len to (amt + 1) step -1)
|
||||
dropItemToGround(held_items[i])
|
||||
held_items.len = amt
|
||||
|
||||
@@ -472,14 +472,14 @@
|
||||
/mob/living/carbon/human/change_number_of_hands(amt)
|
||||
var/old_limbs = held_items.len
|
||||
if(amt < old_limbs)
|
||||
for(var/i in hand_bodyparts.len to amt step -1)
|
||||
for(var/i in hand_bodyparts.len to (amt + 1) step -1)
|
||||
var/obj/item/bodypart/BP = hand_bodyparts[i]
|
||||
BP.dismember()
|
||||
hand_bodyparts[i] = null
|
||||
hand_bodyparts.len = amt
|
||||
else if(amt > old_limbs)
|
||||
hand_bodyparts.len = amt
|
||||
for(var/i in old_limbs+1 to amt)
|
||||
for(var/i in (old_limbs + 1) to amt)
|
||||
var/path = /obj/item/bodypart/l_arm
|
||||
if(!(i % 2))
|
||||
path = /obj/item/bodypart/r_arm
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
item_flags = ABSTRACT
|
||||
|
||||
/obj/item/bloodcrawl/Initialize()
|
||||
/obj/item/bloodcrawl/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
var/obj/item/radio/radio = null //Let's give it a radio.
|
||||
var/mob/living/brain/brainmob = null //The current occupant.
|
||||
var/mob/living/silicon/robot = null //Appears unused.
|
||||
var/obj/mecha = null //This does not appear to be used outside of reference in mecha.dm.
|
||||
var/obj/vehicle/sealed/mecha = null //This does not appear to be used outside of reference in mecha.dm.
|
||||
var/obj/item/organ/brain/brain = null //The actual brain
|
||||
var/datum/ai_laws/laws = new()
|
||||
var/force_replace_ai_name = FALSE
|
||||
@@ -32,7 +32,7 @@
|
||||
else
|
||||
. += "mmi_dead"
|
||||
|
||||
/obj/item/mmi/Initialize()
|
||||
/obj/item/mmi/Initialize(mapload)
|
||||
. = ..()
|
||||
radio = new(src) //Spawns a radio inside the MMI.
|
||||
radio.broadcasting = 0 //researching radio mmis turned the robofabs into radios because this didnt start as 0.
|
||||
@@ -215,7 +215,7 @@
|
||||
desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs and AIs created with it."
|
||||
overrides_aicore_laws = TRUE
|
||||
|
||||
/obj/item/mmi/syndie/Initialize()
|
||||
/obj/item/mmi/syndie/Initialize(mapload)
|
||||
. = ..()
|
||||
laws = new /datum/ai_laws/syndicate_override()
|
||||
radio.on = 0
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
possible_a_intents = list(INTENT_HELP, INTENT_HARM) //for mechas
|
||||
speech_span = SPAN_ROBOT
|
||||
|
||||
/mob/living/brain/Initialize()
|
||||
/mob/living/brain/Initialize(mapload)
|
||||
. = ..()
|
||||
create_dna(src)
|
||||
if(stored_dna.blood_type)
|
||||
@@ -41,7 +41,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/brain/update_mobility()
|
||||
return ((mobility_flags = (container?.in_contents_of(/obj/mecha)? MOBILITY_FLAGS_DEFAULT : NONE)))
|
||||
return ((mobility_flags = (container?.in_contents_of(/obj/vehicle/sealed/mecha)? MOBILITY_FLAGS_DEFAULT : NONE)))
|
||||
|
||||
/mob/living/brain/ex_act(severity, target, origin) //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
|
||||
return
|
||||
@@ -71,13 +71,6 @@
|
||||
if(stored_dna)
|
||||
stored_dna.real_name = real_name
|
||||
|
||||
/mob/living/brain/ClickOn(atom/A, params)
|
||||
..()
|
||||
if(container)
|
||||
var/obj/mecha/M = container.mecha
|
||||
if(istype(M))
|
||||
return M.click_action(A,src,params)
|
||||
|
||||
/mob/living/brain/forceMove(atom/destination)
|
||||
if(container)
|
||||
return container.forceMove(destination)
|
||||
@@ -98,7 +91,7 @@
|
||||
if(!container)
|
||||
return
|
||||
if (container.mecha)
|
||||
var/obj/mecha/M = container.mecha
|
||||
var/obj/vehicle/sealed/mecha/M = container.mecha
|
||||
if(M.mouse_pointer)
|
||||
client.mouse_pointer_icon = M.mouse_pointer
|
||||
if (client && ranged_ability && ranged_ability.ranged_mousepointer)
|
||||
|
||||
@@ -28,7 +28,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
|
||||
var/list/possible_names //If you leave this blank, it will use the global posibrain names
|
||||
var/picked_name
|
||||
|
||||
/obj/item/mmi/posibrain/Initialize()
|
||||
/obj/item/mmi/posibrain/Initialize(mapload)
|
||||
. = ..()
|
||||
brainmob = new(src)
|
||||
var/new_name
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?")
|
||||
|
||||
/mob/living/carbon/alien/Initialize()
|
||||
/mob/living/carbon/alien/Initialize(mapload)
|
||||
add_verb(src, /mob/living/proc/mob_sleep)
|
||||
add_verb(src, /mob/living/proc/lay_down)
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ Doesn't work on other aliens/AI.*/
|
||||
action_icon_state = "spell_default"
|
||||
action_background_icon_state = "bg_alien"
|
||||
|
||||
/obj/effect/proc_holder/alien/Initialize()
|
||||
/obj/effect/proc_holder/alien/Initialize(mapload)
|
||||
. = ..()
|
||||
action = new(src)
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "aliend"
|
||||
meleeKnockdownPower = 80
|
||||
|
||||
/mob/living/carbon/alien/humanoid/drone/Initialize()
|
||||
/mob/living/carbon/alien/humanoid/drone/Initialize(mapload)
|
||||
AddAbility(new/obj/effect/proc_holder/alien/evolve(null))
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
health = 250
|
||||
icon_state = "alienp"
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize()
|
||||
/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize(mapload)
|
||||
real_name = name
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src))
|
||||
AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve())
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "aliens"
|
||||
meleeSlashHumanPower = 15
|
||||
|
||||
/mob/living/carbon/alien/humanoid/sentinel/Initialize()
|
||||
/mob/living/carbon/alien/humanoid/sentinel/Initialize(mapload)
|
||||
AddAbility(new /obj/effect/proc_holder/alien/sneak)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
|
||||
)))
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/humanoid/Initialize()
|
||||
/mob/living/carbon/alien/humanoid/Initialize(mapload)
|
||||
AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null))
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
icon_state = "alienq"
|
||||
var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen()
|
||||
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/Initialize()
|
||||
/mob/living/carbon/alien/humanoid/royal/queen/Initialize(mapload)
|
||||
//there should only be one queen
|
||||
for(var/mob/living/carbon/alien/humanoid/royal/queen/Q in GLOB.carbon_list)
|
||||
if(Q == src)
|
||||
@@ -110,7 +110,7 @@
|
||||
item_flags = ABSTRACT | DROPDEL
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
|
||||
/obj/item/queenpromote/Initialize()
|
||||
/obj/item/queenpromote/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva)
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/larva/Initialize()
|
||||
/mob/living/carbon/alien/larva/Initialize(mapload)
|
||||
|
||||
AddAbility(new/obj/effect/proc_holder/alien/hide(null))
|
||||
AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null))
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
var/list/alien_powers = list()
|
||||
organ_flags = ORGAN_NO_SPOIL|ORGAN_EDIBLE
|
||||
|
||||
/obj/item/organ/alien/Initialize()
|
||||
/obj/item/organ/alien/Initialize(mapload)
|
||||
. = ..()
|
||||
for(var/A in alien_powers)
|
||||
if(ispath(A))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/mob/living/carbon
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
|
||||
/mob/living/carbon/Initialize()
|
||||
/mob/living/carbon/Initialize(mapload)
|
||||
. = ..()
|
||||
create_reagents(1000, NONE, NO_REAGENTS_VALUE)
|
||||
update_body_parts() //to update the carbon's new bodyparts appearance
|
||||
|
||||
@@ -209,7 +209,7 @@
|
||||
if(!parts.len)
|
||||
return
|
||||
var/obj/item/bodypart/picked = pick(parts)
|
||||
if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? "melee" : burn ? "fire" : stamina ? "bullet" : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
|
||||
if(picked.receive_damage(brute, burn, stamina,check_armor ? run_armor_check(picked, (brute ? MELEE : burn ? FIRE : stamina ? BULLET : null)) : FALSE, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
|
||||
update_damage_overlays()
|
||||
|
||||
//Heal MANY bodyparts, in random order
|
||||
|
||||
@@ -43,10 +43,6 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift)
|
||||
if(client && !suiciding && !(client in GLOB.dead_players_during_shift))
|
||||
GLOB.dead_players_during_shift += client
|
||||
GLOB.deaths_during_shift++
|
||||
if(ismecha(loc))
|
||||
var/obj/mecha/M = loc
|
||||
if(M.occupant == src)
|
||||
M.go_out()
|
||||
|
||||
if(!QDELETED(dna)) //The gibbed param is bit redundant here since dna won't exist at this point if they got deleted.
|
||||
dna.species.spec_death(gibbed, src)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
/datum/emote/living/carbon/human/cry/run_emote(mob/user, params)
|
||||
. = ..()
|
||||
if(. && isipcperson(user))
|
||||
if(. && isrobotic(user))
|
||||
do_fake_sparks(5,FALSE,user)
|
||||
|
||||
/datum/emote/living/carbon/human/dap
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "caucasian_m"
|
||||
SET_APPEARANCE_FLAGS(KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE)
|
||||
|
||||
/mob/living/carbon/human/Initialize()
|
||||
/mob/living/carbon/human/Initialize(mapload)
|
||||
add_verb(src, /mob/living/proc/mob_sleep)
|
||||
add_verb(src, /mob/living/proc/lay_down)
|
||||
add_verb(src, /mob/living/carbon/human/verb/underwear_toggle)
|
||||
@@ -903,7 +903,7 @@
|
||||
/mob/living/carbon/human/species
|
||||
var/race = null
|
||||
|
||||
/mob/living/carbon/human/species/Initialize()
|
||||
/mob/living/carbon/human/species/Initialize(mapload)
|
||||
. = ..()
|
||||
set_species(race)
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
dna.species.on_hit(P, src)
|
||||
|
||||
|
||||
/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone)
|
||||
/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE)
|
||||
if(dna && dna.species)
|
||||
var/spec_return = dna.species.bullet_act(P, src)
|
||||
if(spec_return)
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
if(mind) //martial art stuff
|
||||
if(mind.martial_art && mind.martial_art.can_use(src)) //Some martial arts users can deflect projectiles!
|
||||
var/martial_art_result = mind.martial_art.on_projectile_hit(src, P, def_zone)
|
||||
var/martial_art_result = mind.martial_art.on_projectile_hit(src, P, def_zone, piercing_hit)
|
||||
if(!(martial_art_result == BULLET_ACT_HIT))
|
||||
return martial_art_result
|
||||
return ..()
|
||||
@@ -163,7 +163,7 @@
|
||||
if(can_inject(M, 1, affecting))//Thick suits can stop monkey bites.
|
||||
if(..()) //successful monkey bite, this handles disease contraction.
|
||||
var/damage = rand(1, 3)
|
||||
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, MELEE))
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M)
|
||||
@@ -183,7 +183,7 @@
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
|
||||
if(!affecting)
|
||||
affecting = get_bodypart(BODY_ZONE_CHEST)
|
||||
var/armor_block = run_armor_check(affecting, "melee", null, null,10)
|
||||
var/armor_block = run_armor_check(affecting, MELEE, null, null,10)
|
||||
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has slashed at [src]!</span>", \
|
||||
@@ -219,7 +219,7 @@
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected))
|
||||
if(!affecting)
|
||||
affecting = get_bodypart(BODY_ZONE_CHEST)
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
var/armor_block = run_armor_check(affecting, MELEE)
|
||||
apply_damage(damage, BRUTE, affecting, armor_block)
|
||||
|
||||
|
||||
@@ -233,7 +233,7 @@
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
|
||||
if(!affecting)
|
||||
affecting = get_bodypart(BODY_ZONE_CHEST)
|
||||
var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration)
|
||||
var/armor = run_armor_check(affecting, MELEE, armour_penetration = M.armour_penetration)
|
||||
apply_damage(damage, M.melee_damage_type, affecting, armor, wound_bonus = M.wound_bonus, bare_wound_bonus = M.bare_wound_bonus, sharpness = M.sharpness)
|
||||
|
||||
/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M)
|
||||
@@ -253,51 +253,9 @@
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
|
||||
if(!affecting)
|
||||
affecting = get_bodypart(BODY_ZONE_CHEST)
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
var/armor_block = run_armor_check(affecting, MELEE)
|
||||
apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod)
|
||||
|
||||
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
|
||||
if(M.occupant.a_intent == INTENT_HARM)
|
||||
if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
|
||||
to_chat(M.occupant, "<span class='warning'>You don't want to harm other living beings!</span>")
|
||||
return
|
||||
M.do_attack_animation(src)
|
||||
if(M.damtype == "brute")
|
||||
step_away(src,M,15)
|
||||
var/obj/item/bodypart/temp = get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_HEAD))
|
||||
if(temp)
|
||||
var/update = 0
|
||||
var/dmg = rand(M.force/2, M.force)
|
||||
var/atom/throw_target = get_edge_target_turf(src, M.dir)
|
||||
switch(M.damtype)
|
||||
if("brute")
|
||||
if(M.force > 35) // durand and other heavy mechas
|
||||
DefaultCombatKnockdown(50)
|
||||
src.throw_at(throw_target, rand(1,5), 7)
|
||||
else if(M.force >= 20 && CHECK_MOBILITY(src, MOBILITY_STAND)) // lightweight mechas like gygax
|
||||
DefaultCombatKnockdown(30)
|
||||
src.throw_at(throw_target, rand(1,3), 7)
|
||||
update |= temp.receive_damage(dmg, 0)
|
||||
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
|
||||
if("fire")
|
||||
update |= temp.receive_damage(0, dmg)
|
||||
playsound(src, 'sound/items/welder.ogg', 50, 1)
|
||||
if("tox")
|
||||
M.mech_toxin_damage(src)
|
||||
else
|
||||
return
|
||||
if(update)
|
||||
update_damage_overlays()
|
||||
updatehealth()
|
||||
|
||||
visible_message("<span class='danger'>[M.name] has hit [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] has hit you!</span>", null, COMBAT_MESSAGE_RANGE, target = M,
|
||||
target_message = "<span class='danger'>You have hit [src]!</span>")
|
||||
log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
|
||||
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/human/ex_act(severity, target, origin)
|
||||
if(TRAIT_BOMBIMMUNE in dna.species.species_traits)
|
||||
@@ -307,7 +265,7 @@
|
||||
return
|
||||
var/brute_loss = 0
|
||||
var/burn_loss = 0
|
||||
var/bomb_armor = getarmor(null, "bomb")
|
||||
var/bomb_armor = getarmor(null, BOMB)
|
||||
|
||||
//200 max knockdown for EXPLODE_HEAVY
|
||||
//160 max knockdown for EXPLODE_LIGHT
|
||||
@@ -328,7 +286,7 @@
|
||||
brute_loss = 500
|
||||
var/atom/throw_target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
|
||||
throw_at(throw_target, 200, 4)
|
||||
damage_clothes(400 - bomb_armor, BRUTE, "bomb")
|
||||
damage_clothes(400 - bomb_armor, BRUTE, BOMB)
|
||||
|
||||
if (EXPLODE_HEAVY)
|
||||
brute_loss = 60
|
||||
@@ -336,7 +294,7 @@
|
||||
if(bomb_armor)
|
||||
brute_loss = 30*(2 - round(bomb_armor*0.01, 0.05))
|
||||
burn_loss = brute_loss //damage gets reduced from 120 to up to 60 combined brute+burn
|
||||
damage_clothes(200 - bomb_armor, BRUTE, "bomb")
|
||||
damage_clothes(200 - bomb_armor, BRUTE, BOMB)
|
||||
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
|
||||
adjustEarDamage(30, 120)
|
||||
Unconscious(20) //short amount of time for follow up attacks against elusive enemies like wizards
|
||||
@@ -347,7 +305,7 @@
|
||||
brute_loss = 30
|
||||
if(bomb_armor)
|
||||
brute_loss = 15*(2 - round(bomb_armor*0.01, 0.05))
|
||||
damage_clothes(max(50 - bomb_armor, 0), BRUTE, "bomb")
|
||||
damage_clothes(max(50 - bomb_armor, 0), BRUTE, BOMB)
|
||||
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
|
||||
adjustEarDamage(15,60)
|
||||
Knockdown((160 - (bomb_armor * 1.6)) / 4) //100 bomb armor will prevent knockdown altogether
|
||||
@@ -360,7 +318,7 @@
|
||||
var/max_limb_loss = round(4/severity) //so you don't lose four limbs at severity 3.
|
||||
for(var/X in bodyparts)
|
||||
var/obj/item/bodypart/BP = X
|
||||
if(prob(50/severity) && !prob(getarmor(BP, "bomb")) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST)
|
||||
if(prob(50/severity) && !prob(getarmor(BP, BOMB)) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST)
|
||||
BP.brute_dam = BP.max_damage
|
||||
BP.dismember()
|
||||
max_limb_loss--
|
||||
@@ -374,7 +332,7 @@
|
||||
show_message("<span class='userdanger'>The blob attacks you!</span>")
|
||||
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
|
||||
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
|
||||
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, MELEE))
|
||||
|
||||
|
||||
///Calculates the siemens coeff based on clothing and species, can also restart hearts.
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
/datum/action/innate/ability/humanoid_customization/proc/change_form()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Body Color", "Eye Color","Hair Style", "Genitals", "Tail", "Snout", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Cancel")
|
||||
var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Body Color", "Eye Color","Hair Style", "Genitals", "Tail", "Snout", "Wings", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Butt Size", "Cancel")
|
||||
|
||||
if(select_alteration == "Body Color")
|
||||
var/new_color = input(owner, "Choose your skin color:", "Race change","#"+H.dna.features["mcolor"]) as color|null
|
||||
@@ -116,6 +116,25 @@
|
||||
if(new_snout)
|
||||
H.dna.features["mam_snouts"] = new_snout
|
||||
H.update_body()
|
||||
|
||||
else if (select_alteration == "Wings")
|
||||
var/new_color = input(owner, "Choose your wing color:", "Race change","#"+H.dna.features["wings_color"]) as color|null
|
||||
if(new_color)
|
||||
H.dna.features["wings_color"] = sanitize_hexcolor(new_color, 6)
|
||||
H.update_body()
|
||||
H.update_hair()
|
||||
var/list/snowflake_wings_list = list("Normal" = null)
|
||||
for(var/path in GLOB.deco_wings_list)
|
||||
var/datum/sprite_accessory/deco_wings/instance = GLOB.deco_wings_list[path]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
||||
snowflake_wings_list[S.name] = path
|
||||
var/new_wings
|
||||
new_wings = input(owner, "Choose your character's wings:", "Wing Alteration") as null|anything in snowflake_wings_list
|
||||
if(new_wings)
|
||||
H.dna.features["deco_wings"] = new_wings
|
||||
H.update_body()
|
||||
|
||||
else if (select_alteration == "Markings")
|
||||
var/list/snowflake_markings_list = list("None")
|
||||
@@ -227,5 +246,17 @@
|
||||
H.apply_overlay()
|
||||
H.give_genital(/obj/item/organ/genital/breasts)
|
||||
|
||||
else if (select_alteration == "Butt Size")
|
||||
for(var/obj/item/organ/genital/butt/X in H.internal_organs)
|
||||
qdel(X)
|
||||
var/min_B = CONFIG_GET(number/butt_min_size_prefs)
|
||||
var/max_B = CONFIG_GET(number/butt_max_size_prefs)
|
||||
var/new_length = input(owner, "Butt size:\n([min_B]-[max_B])", "Genital Alteration") as num|null
|
||||
if(new_length)
|
||||
H.dna.features["butt_size"] = clamp(round(new_length), min_B, max_B)
|
||||
H.update_genitals()
|
||||
H.apply_overlay()
|
||||
H.give_genital(/obj/item/organ/genital/butt)
|
||||
|
||||
else
|
||||
return
|
||||
|
||||
@@ -1696,7 +1696,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
return FALSE
|
||||
|
||||
|
||||
var/armor_block = target.run_armor_check(affecting, "melee")
|
||||
var/armor_block = target.run_armor_check(affecting, MELEE)
|
||||
playsound(target.loc, user.dna.species.attack_sound_override || attack_sound, 25, 1, -1)
|
||||
target.visible_message("<span class='danger'>[user] [atk_verb]ed [target]!</span>", \
|
||||
"<span class='userdanger'>[user] [atk_verb]ed you!</span>", null, COMBAT_MESSAGE_RANGE, null, \
|
||||
@@ -1905,7 +1905,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
hit_area = affecting.name
|
||||
var/def_zone = affecting.body_zone
|
||||
|
||||
var/armor_block = H.run_armor_check(affecting, "melee", "<span class='notice'>Your armor has protected your [hit_area].</span>", "<span class='notice'>Your armor has softened a hit to your [hit_area].</span>",I.armour_penetration)
|
||||
var/armor_block = H.run_armor_check(affecting, MELEE, "<span class='notice'>Your armor has protected your [hit_area].</span>", "<span class='notice'>Your armor has softened a hit to your [hit_area].</span>",I.armour_penetration)
|
||||
armor_block = min(90,armor_block) //cap damage reduction at 90%
|
||||
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
|
||||
var/Iwound_bonus = I.wound_bonus
|
||||
@@ -2404,7 +2404,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
for(var/X in burning_items)
|
||||
var/obj/item/I = X
|
||||
if(!(I.resistance_flags & FIRE_PROOF))
|
||||
I.take_damage(H.fire_stacks, BURN, "fire", 0)
|
||||
I.take_damage(H.fire_stacks, BURN, FIRE, 0)
|
||||
|
||||
var/thermal_protection = H.easy_thermal_protection()
|
||||
|
||||
|
||||
@@ -347,7 +347,7 @@
|
||||
|
||||
/datum/species/golem/sand/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
if(!(P.original == H && P.firer == H))
|
||||
if(P.flag == "bullet" || P.flag == "bomb")
|
||||
if(P.flag == BULLET || P.flag == BOMB)
|
||||
playsound(H, 'sound/effects/shovel_dig.ogg', 70, 1)
|
||||
H.visible_message("<span class='danger'>The [P.name] sinks harmlessly in [H]'s sandy body!</span>", \
|
||||
"<span class='userdanger'>The [P.name] sinks harmlessly in [H]'s sandy body!</span>")
|
||||
@@ -379,7 +379,7 @@
|
||||
|
||||
/datum/species/golem/glass/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
if(!(P.original == H && P.firer == H)) //self-shots don't reflect
|
||||
if(P.flag == "laser" || P.flag == "energy")
|
||||
if(P.flag == LASER || P.flag == ENERGY)
|
||||
H.visible_message("<span class='danger'>The [P.name] gets reflected by [H]'s glass skin!</span>", \
|
||||
"<span class='userdanger'>The [P.name] gets reflected by [H]'s glass skin!</span>")
|
||||
if(P.starting)
|
||||
@@ -741,7 +741,7 @@
|
||||
name = "pile of bandages"
|
||||
desc = "It emits a strange aura, as if there was still life within it..."
|
||||
max_integrity = 50
|
||||
armor = list("melee" = 90, "bullet" = 90, "laser" = 25, "energy" = 80, "bomb" = 50, "bio" = 100, "fire" = -50, "acid" = -50)
|
||||
armor = list(MELEE = 90, BULLET = 90, LASER = 25, ENERGY = 80, BOMB = 50, BIO = 100, FIRE = -50, ACID = -50)
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "pile_bandages"
|
||||
resistance_flags = FLAMMABLE
|
||||
@@ -829,7 +829,7 @@
|
||||
/datum/species/golem/bronze/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
if(!(world.time > last_gong_time + gong_cooldown))
|
||||
return ..()
|
||||
if(P.flag == "bullet" || P.flag == "bomb")
|
||||
if(P.flag == BULLET || P.flag == BOMB)
|
||||
gong(H)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -474,7 +474,7 @@
|
||||
light_color = "#FFFFFF"
|
||||
light_range = LUMINESCENT_DEFAULT_GLOW
|
||||
|
||||
/obj/effect/dummy/luminescent_glow/Initialize()
|
||||
/obj/effect/dummy/luminescent_glow/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!isliving(loc))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
sharpness = SHARP_EDGED
|
||||
total_mass = TOTAL_MASS_HAND_REPLACEMENT
|
||||
|
||||
/obj/item/light_eater/Initialize()
|
||||
/obj/item/light_eater/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, HAND_REPLACEMENT_TRAIT)
|
||||
AddComponent(/datum/component/butchering, 80, 70)
|
||||
@@ -211,7 +211,7 @@
|
||||
visible_message("<span class='danger'>[S] is disintegrated by [src]!</span>")
|
||||
else if(AM.light_range && AM.light_power && !(istype(AM, /obj/machinery/power/apc) || istype(AM, /obj/machinery/airalarm)))
|
||||
var/obj/target_object = AM
|
||||
target_object.take_damage(force * 5, BRUTE, "melee", 0)
|
||||
target_object.take_damage(force * 5, BRUTE, MELEE, 0)
|
||||
|
||||
|
||||
/obj/item/light_eater/proc/disintegrate(obj/item/O)
|
||||
|
||||
@@ -162,7 +162,7 @@
|
||||
for(var/X in burning_items)
|
||||
var/obj/item/I = X
|
||||
if(!(I.resistance_flags & FIRE_PROOF))
|
||||
I.take_damage(fire_stacks, BURN, "fire", 0)
|
||||
I.take_damage(fire_stacks, BURN, FIRE, 0)
|
||||
|
||||
adjust_bodytemperature(BODYTEMP_HEATING_MAX)
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
|
||||
|
||||
@@ -180,7 +180,7 @@ GLOBAL_LIST_INIT(strippable_monkey_items, create_strippable_list(list(
|
||||
/mob/living/carbon/monkey/angry
|
||||
aggressive = TRUE
|
||||
|
||||
/mob/living/carbon/monkey/angry/Initialize()
|
||||
/mob/living/carbon/monkey/angry/Initialize(mapload)
|
||||
. = ..()
|
||||
if(prob(10))
|
||||
var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
|
||||
|
||||
@@ -195,14 +195,14 @@
|
||||
|
||||
if (EXPLODE_HEAVY)
|
||||
take_overall_damage(60, 60)
|
||||
damage_clothes(200, BRUTE, "bomb")
|
||||
damage_clothes(200, BRUTE, BOMB)
|
||||
adjustEarDamage(30, 120)
|
||||
if(prob(70))
|
||||
Unconscious(200)
|
||||
|
||||
if(EXPLODE_LIGHT)
|
||||
take_overall_damage(30, 0)
|
||||
damage_clothes(50, BRUTE, "bomb")
|
||||
damage_clothes(50, BRUTE, BOMB)
|
||||
adjustEarDamage(15,60)
|
||||
if (prob(50))
|
||||
Unconscious(160)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/list/pet_monkey_names = list("Pun Pun", "Bubbles", "Mojo", "George", "Darwin", "Aldo", "Caeser", "Kanzi", "Kong", "Terk", "Grodd", "Mala", "Bojangles", "Coco", "Able", "Baker", "Scatter", "Norbit", "Travis")
|
||||
var/list/rare_pet_monkey_names = list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky")
|
||||
|
||||
/mob/living/carbon/monkey/punpun/Initialize()
|
||||
/mob/living/carbon/monkey/punpun/Initialize(mapload)
|
||||
Read_Memory()
|
||||
if(ancestor_name)
|
||||
name = ancestor_name
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
/datum/emote/living/blush/run_emote(mob/user, params)
|
||||
. = ..()
|
||||
if(. && isipcperson(user))
|
||||
if(. && isrobotic(user))
|
||||
do_fake_sparks(5,FALSE,user)
|
||||
|
||||
/datum/emote/living/bow
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
SHOULD_NOT_SLEEP(TRUE)
|
||||
if(mob_transforming)
|
||||
return
|
||||
|
||||
. = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds, times_fired)
|
||||
if(!(. & COMPONENT_INTERRUPT_LIFE_PHYSICAL))
|
||||
PhysicalLife(seconds, times_fired)
|
||||
if(!(. & COMPONENT_INTERRUPT_LIFE_BIOLOGICAL))
|
||||
BiologicalLife(seconds, times_fired)
|
||||
|
||||
if(!(. & COMPONET_INTERRUPT_STATUS_EFFECTS))
|
||||
handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc
|
||||
// CODE BELOW SHOULD ONLY BE THINGS THAT SHOULD HAPPEN NO MATTER WHAT AND CAN NOT BE SUSPENDED!
|
||||
// Otherwise, it goes into one of the two split Life procs!
|
||||
|
||||
@@ -69,9 +69,8 @@
|
||||
|
||||
handle_block_parry(seconds)
|
||||
|
||||
// These two MIGHT need to be moved to base Life() if we get any in the future that's a "physical" effect that needs to fire even while in stasis.
|
||||
handle_traits() // eye, ear, brain damages
|
||||
handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc
|
||||
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/Initialize()
|
||||
/mob/living/Initialize(mapload)
|
||||
. = ..()
|
||||
if(unique_name)
|
||||
name = "[name] ([rand(1, 1000)])"
|
||||
@@ -433,8 +433,8 @@
|
||||
to_chat(src, "<span class='notice'>You have given up life and succumbed to death.</span>")
|
||||
death()
|
||||
|
||||
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE)
|
||||
if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)))
|
||||
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE, ignore_stasis = FALSE)
|
||||
if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab)) || (!ignore_stasis && IS_IN_STASIS(src)))
|
||||
return TRUE
|
||||
|
||||
/mob/living/canUseStorage()
|
||||
@@ -1124,7 +1124,7 @@
|
||||
|
||||
amount -= RAD_BACKGROUND_RADIATION // This will always be at least 1 because of how skin protection is calculated
|
||||
|
||||
var/blocked = getarmor(null, "rad")
|
||||
var/blocked = getarmor(null, RAD)
|
||||
|
||||
if(amount > RAD_BURN_THRESHOLD)
|
||||
apply_damage((amount-RAD_BURN_THRESHOLD)/RAD_BURN_THRESHOLD, BURN, null, blocked)
|
||||
@@ -1153,7 +1153,7 @@
|
||||
visible_message("<span class='warning'>[src] catches fire!</span>", \
|
||||
"<span class='userdanger'>You're set on fire!</span>")
|
||||
new/obj/effect/dummy/lighting_obj/moblight/fire(src)
|
||||
throw_alert("fire", /atom/movable/screen/alert/fire)
|
||||
throw_alert(FIRE, /atom/movable/screen/alert/fire)
|
||||
update_fire()
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_IGNITED,src)
|
||||
return TRUE
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!", silent=FALSE)
|
||||
/mob/living/proc/run_armor_check(def_zone = null, attack_flag = MELEE, absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!", silent=FALSE)
|
||||
var/armor = getarmor(def_zone, attack_flag)
|
||||
|
||||
if(silent)
|
||||
@@ -68,7 +68,7 @@
|
||||
else
|
||||
CRASH("Invalid rediretion mode [redirection_mode]")
|
||||
|
||||
/mob/living/bullet_act(obj/item/projectile/P, def_zone)
|
||||
/mob/living/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE)
|
||||
var/totaldamage = P.damage
|
||||
var/final_percent = 0
|
||||
if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself
|
||||
@@ -81,7 +81,7 @@
|
||||
if(returned & BLOCK_REDIRECTED)
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
if(returned & BLOCK_SUCCESS)
|
||||
P.on_hit(src, final_percent, def_zone)
|
||||
P.on_hit(src, final_percent, def_zone, piercing_hit)
|
||||
return BULLET_ACT_BLOCK
|
||||
totaldamage = block_calculate_resultant_damage(totaldamage, returnlist)
|
||||
var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null)
|
||||
@@ -141,7 +141,7 @@
|
||||
"<span class='userdanger'>You're hit by [I]!</span>")
|
||||
if(!I.throwforce)
|
||||
return
|
||||
var/armor = run_armor_check(impacting_zone, "melee", "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration)
|
||||
var/armor = run_armor_check(impacting_zone, MELEE, "Your armor has protected your [parse_zone(impacting_zone)].", "Your armor has softened hit to your [parse_zone(impacting_zone)].",I.armour_penetration)
|
||||
apply_damage(I.throwforce, dtype, impacting_zone, armor, sharpness=I.get_sharpness(), wound_bonus=(nosell_hit * CANT_WOUND))
|
||||
else
|
||||
return 1
|
||||
@@ -149,39 +149,6 @@
|
||||
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/mech_melee_attack(obj/mecha/M)
|
||||
if(M.occupant.a_intent == INTENT_HARM)
|
||||
if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
|
||||
to_chat(M.occupant, "<span class='warning'>You don't want to harm other living beings!</span>")
|
||||
return
|
||||
M.do_attack_animation(src)
|
||||
if(M.damtype == "brute")
|
||||
step_away(src,M,15)
|
||||
switch(M.damtype)
|
||||
if(BRUTE)
|
||||
Unconscious(20)
|
||||
take_overall_damage(rand(M.force/2, M.force))
|
||||
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
|
||||
if(BURN)
|
||||
take_overall_damage(0, rand(M.force/2, M.force))
|
||||
playsound(src, 'sound/items/welder.ogg', 50, 1)
|
||||
if(TOX)
|
||||
M.mech_toxin_damage(src)
|
||||
else
|
||||
return
|
||||
updatehealth()
|
||||
visible_message("<span class='danger'>[M.name] has hit [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] has hit you!</span>", null, COMBAT_MESSAGE_RANGE, null,
|
||||
M.occupant, "<span class='danger'>You hit [src] with your [M.name]!</span>")
|
||||
log_combat(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
|
||||
else
|
||||
step_away(src,M)
|
||||
log_combat(M.occupant, src, "pushed", M)
|
||||
visible_message("<span class='warning'>[M] pushes [src] out of the way.</span>", \
|
||||
"<span class='warning'>[M] pushes you out of the way.</span>", null, COMBAT_MESSAGE_RANGE, null,
|
||||
M.occupant, "<span class='warning'>You push [src] out of the way with your [M.name].</span>")
|
||||
|
||||
/mob/living/fire_act()
|
||||
adjust_fire_stacks(3)
|
||||
IgniteMob()
|
||||
|
||||
@@ -20,12 +20,10 @@
|
||||
/mob/living/proc/update_density()
|
||||
density = !lying && !HAS_TRAIT(src, TRAIT_LIVING_NO_DENSITY)
|
||||
|
||||
/mob/living/CanPass(atom/movable/mover, turf/target)
|
||||
if((mover.pass_flags & PASSMOB))
|
||||
return TRUE
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = mover
|
||||
return !P.can_hit_target(src, P.permutated, src == P.original, TRUE)
|
||||
/mob/living/CanAllowThrough(atom/movable/mover, turf/target)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(mover.throwing)
|
||||
return (!density || lying)
|
||||
if(buckled == mover)
|
||||
@@ -41,7 +39,7 @@
|
||||
var/mob/living/L = mover //typecast first, check isliving and only check this if living using short circuit
|
||||
if(isliving(L) && lying && L.lying) //if we're both lying down and aren't already being thrown/shipped around, don't pass
|
||||
return FALSE
|
||||
return (!density || (isliving(mover)? L.can_move_under_living(src) : !mover.density))
|
||||
return (isliving(mover)? L.can_move_under_living(src) : !mover.density)
|
||||
|
||||
/mob/living/toggle_move_intent()
|
||||
. = ..()
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
|
||||
var/viewalerts = 0
|
||||
var/icon/holo_icon//Female is assigned when AI is created.
|
||||
var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
|
||||
var/obj/vehicle/sealed/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
|
||||
var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not.
|
||||
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
|
||||
var/obj/item/pda/ai/aiPDA
|
||||
@@ -408,7 +408,7 @@
|
||||
return
|
||||
|
||||
if (href_list["ai_take_control"]) //Mech domination
|
||||
var/obj/mecha/M = locate(href_list["ai_take_control"])
|
||||
var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"])
|
||||
if(controlled_mech)
|
||||
to_chat(src, "<span class='warning'>You are already loaded into an onboard computer!</span>")
|
||||
return
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
if(stat == DEAD)
|
||||
return
|
||||
|
||||
if(!gibbed)
|
||||
// Will update all AI status displays with a blue screen of death
|
||||
INVOKE_ASYNC(src, .proc/emote, "bsod")
|
||||
|
||||
. = ..()
|
||||
|
||||
var/old_icon = icon_state
|
||||
@@ -29,12 +33,6 @@
|
||||
spawn(10)
|
||||
explosion(src.loc, 3, 6, 12, 15)
|
||||
|
||||
if(src.key)
|
||||
for(var/each in GLOB.ai_status_displays) //change status
|
||||
var/obj/machinery/status_display/ai/O = each
|
||||
O.mode = 2
|
||||
O.update()
|
||||
|
||||
if(istype(loc, /obj/item/aicard/aitater))
|
||||
loc.icon_state = "aitater-404"
|
||||
else if(istype(loc, /obj/item/aicard/aispook))
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
/datum/emote/ai
|
||||
mob_type_allowed_typecache = /mob/living/silicon/ai
|
||||
mob_type_blacklist_typecache = list()
|
||||
|
||||
|
||||
/datum/emote/ai/emotion_display
|
||||
key = "blank"
|
||||
var/emotion = AI_EMOTION_BLANK
|
||||
|
||||
/datum/emote/ai/emotion_display/run_emote(mob/user, params, type_override, intentional)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/mob/living/silicon/ai/ai = user
|
||||
var/turf/ai_turf = get_turf(ai)
|
||||
|
||||
for(var/_display in GLOB.ai_status_displays)
|
||||
var/obj/machinery/status_display/ai/ai_display = _display
|
||||
var/turf/display_turf = get_turf(ai_display)
|
||||
|
||||
// Derelict AIs can't affect station displays.
|
||||
// TODO does this need to be made multiZ aware?
|
||||
if(ai_turf.z != display_turf.z)
|
||||
continue
|
||||
|
||||
ai_display.emotion = emotion
|
||||
ai_display.update()
|
||||
|
||||
/datum/emote/ai/emotion_display/very_happy
|
||||
key = "veryhappy"
|
||||
emotion = AI_EMOTION_VERY_HAPPY
|
||||
|
||||
/datum/emote/ai/emotion_display/happy
|
||||
key = "happy"
|
||||
emotion = AI_EMOTION_HAPPY
|
||||
|
||||
/datum/emote/ai/emotion_display/neutral
|
||||
key = "neutral"
|
||||
emotion = AI_EMOTION_NEUTRAL
|
||||
|
||||
/datum/emote/ai/emotion_display/unsure
|
||||
key = "unsure"
|
||||
emotion = AI_EMOTION_UNSURE
|
||||
|
||||
/datum/emote/ai/emotion_display/confused
|
||||
key = "confused"
|
||||
emotion = AI_EMOTION_CONFUSED
|
||||
|
||||
/datum/emote/ai/emotion_display/sad
|
||||
key = "sad"
|
||||
emotion = AI_EMOTION_SAD
|
||||
|
||||
/datum/emote/ai/emotion_display/bsod
|
||||
key = "bsod"
|
||||
emotion = AI_EMOTION_BSOD
|
||||
|
||||
/datum/emote/ai/emotion_display/trollface
|
||||
key = "trollface"
|
||||
emotion = AI_EMOTION_PROBLEMS
|
||||
|
||||
/datum/emote/ai/emotion_display/awesome
|
||||
key = "awesome"
|
||||
emotion = AI_EMOTION_AWESOME
|
||||
|
||||
/datum/emote/ai/emotion_display/dorfy
|
||||
key = "dorfy"
|
||||
emotion = AI_EMOTION_DORFY
|
||||
|
||||
/datum/emote/ai/emotion_display/thinking
|
||||
key = "thinking"
|
||||
emotion = AI_EMOTION_THINKING
|
||||
|
||||
/datum/emote/ai/emotion_display/facepalm
|
||||
key = "facepalm"
|
||||
key_third_person = "facepalms"
|
||||
emotion = AI_EMOTION_FACEPALM
|
||||
|
||||
/datum/emote/ai/emotion_display/friend_computer
|
||||
key = "friendcomputer"
|
||||
emotion = AI_EMOTION_FRIEND_COMPUTER
|
||||
|
||||
/datum/emote/ai/emotion_display/friend_computer/run_emote(mob/user, params, type_override, intentional)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
|
||||
|
||||
if(!frequency)
|
||||
return
|
||||
|
||||
var/datum/signal/status_signal = new(list("command" = "friendcomputer"))
|
||||
frequency.post_signal(src, status_signal)
|
||||
|
||||
/datum/emote/ai/emotion_display/blue_glow
|
||||
key = "blueglow"
|
||||
emotion = AI_EMOTION_BLUE_GLOW
|
||||
|
||||
/datum/emote/ai/emotion_display/red_glow
|
||||
key = "redglow"
|
||||
emotion = AI_EMOTION_RED_GLOW
|
||||
@@ -18,7 +18,7 @@
|
||||
var/ai_detector_visible = TRUE
|
||||
var/ai_detector_color = COLOR_RED
|
||||
|
||||
/mob/camera/aiEye/Initialize()
|
||||
/mob/camera/aiEye/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.aiEyes += src
|
||||
update_ai_detect_hud()
|
||||
|
||||
@@ -53,11 +53,11 @@
|
||||
if(NONE)
|
||||
return FALSE
|
||||
if(POWER_REQ_ALL)
|
||||
return !T || !A || ((!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
return !T || !A || ((!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/vehicle/sealed/mecha)))
|
||||
if(POWER_REQ_CLOCKCULT)
|
||||
for(var/obj/effect/clockwork/sigil/transmission/ST in range(src, SIGIL_ACCESS_RANGE))
|
||||
return FALSE
|
||||
return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/vehicle/sealed/mecha)))
|
||||
|
||||
/mob/living/silicon/ai/updatehealth()
|
||||
if(status_flags & GODMODE)
|
||||
|
||||
@@ -1,11 +1,5 @@
|
||||
/mob/living/silicon/ai/Login()
|
||||
..()
|
||||
if(stat != DEAD)
|
||||
for(var/each in GLOB.ai_status_displays) //change status
|
||||
var/obj/machinery/status_display/ai/O = each
|
||||
O.mode = 1
|
||||
O.emotion = emote_display
|
||||
O.update()
|
||||
set_eyeobj_visible(TRUE)
|
||||
if(multicam_on)
|
||||
end_multicam()
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
/mob/living/silicon/ai/Logout()
|
||||
..()
|
||||
for(var/each in GLOB.ai_status_displays) //change status
|
||||
var/obj/machinery/status_display/ai/O = each
|
||||
O.mode = 0
|
||||
O.update()
|
||||
set_eyeobj_visible(FALSE)
|
||||
view_core()
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
var/highlighted = FALSE
|
||||
var/mob/camera/aiEye/pic_in_pic/aiEye
|
||||
|
||||
/atom/movable/screen/movable/pic_in_pic/ai/Initialize()
|
||||
/atom/movable/screen/movable/pic_in_pic/ai/Initialize(mapload)
|
||||
. = ..()
|
||||
aiEye = new /mob/camera/aiEye/pic_in_pic()
|
||||
aiEye.screen = src
|
||||
@@ -103,7 +103,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room)
|
||||
icon = 'icons/mob/landmarks.dmi'
|
||||
icon_state = "x"
|
||||
|
||||
/obj/effect/landmark/ai_multicam_room/Initialize()
|
||||
/obj/effect/landmark/ai_multicam_room/Initialize(mapload)
|
||||
. = ..()
|
||||
qdel(GLOB.ai_camera_room_landmark)
|
||||
GLOB.ai_camera_room_landmark = src
|
||||
|
||||
@@ -11,3 +11,10 @@
|
||||
if(G)
|
||||
mind.remove_antag_datum(G)
|
||||
..()
|
||||
|
||||
/mob/living/silicon/auto_deadmin_on_login()
|
||||
if(!client?.holder)
|
||||
return TRUE
|
||||
if(CONFIG_GET(flag/auto_deadmin_silicons) || (client.prefs?.deadmin & DEADMIN_POSITION_SILICON))
|
||||
return client.holder.auto_deadmin()
|
||||
return ..()
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
GLOB.pai_list -= src
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/pai/Initialize()
|
||||
/mob/living/silicon/pai/Initialize(mapload)
|
||||
var/obj/item/paicard/P = loc
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
GLOB.pai_list += src
|
||||
@@ -143,7 +143,7 @@
|
||||
custom_holoform.Grant(src)
|
||||
emitter_next_use = world.time + 10 SECONDS
|
||||
|
||||
/mob/living/silicon/pai/deployed/Initialize()
|
||||
/mob/living/silicon/pai/deployed/Initialize(mapload)
|
||||
. = ..()
|
||||
fold_out(TRUE)
|
||||
|
||||
|
||||
@@ -731,7 +731,7 @@
|
||||
/mob/living/silicon/robot/modules
|
||||
var/set_module = /obj/item/robot_module
|
||||
|
||||
/mob/living/silicon/robot/modules/Initialize()
|
||||
/mob/living/silicon/robot/modules/Initialize(mapload)
|
||||
. = ..()
|
||||
module.transform_to(set_module)
|
||||
|
||||
@@ -772,7 +772,7 @@
|
||||
cell = /obj/item/stock_parts/cell/hyper
|
||||
// radio = /obj/item/radio/borg/syndicate
|
||||
|
||||
/mob/living/silicon/robot/modules/syndicate/Initialize()
|
||||
/mob/living/silicon/robot/modules/syndicate/Initialize(mapload)
|
||||
. = ..()
|
||||
radio = new /obj/item/radio/borg/syndicate(src)
|
||||
laws = new /datum/ai_laws/syndicate_override()
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
var/moduleselect_alternate_icon
|
||||
var/dogborg = FALSE
|
||||
|
||||
/obj/item/robot_module/Initialize()
|
||||
/obj/item/robot_module/Initialize(mapload)
|
||||
. = ..()
|
||||
for(var/i in basic_modules)
|
||||
var/obj/item/I = new i(src)
|
||||
@@ -638,7 +638,7 @@
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_module/security/Initialize()
|
||||
/obj/item/robot_module/security/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!CONFIG_GET(flag/weaken_secborg))
|
||||
for(var/obj/item/gun/energy/disabler/cyborg/pewpew in basic_modules)
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
typing_indicator_state = /obj/effect/overlay/typing_indicator/machine
|
||||
|
||||
/mob/living/silicon/Initialize()
|
||||
/mob/living/silicon/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.silicon_mobs += src
|
||||
faction += "silicon"
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
"<span class='boldwarning'>You are thrown off of [src]!</span>")
|
||||
flash_act(affect_silicon = 1)
|
||||
|
||||
/mob/living/silicon/bullet_act(obj/item/projectile/P, def_zone)
|
||||
/mob/living/silicon/bullet_act(obj/item/projectile/P, def_zone, piercing_hit = FALSE)
|
||||
var/totaldamage = P.damage
|
||||
if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself
|
||||
var/list/returnlist = list()
|
||||
@@ -141,7 +141,7 @@
|
||||
"<span class='boldwarning'>You are knocked off of [src] by the [P]!</span>")
|
||||
unbuckle_mob(M)
|
||||
M.DefaultCombatKnockdown(40)
|
||||
P.on_hit(src, 0, def_zone)
|
||||
P.on_hit(src, 0, def_zone, 0, piercing_hit)
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/tiled/flash/static)
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = "melee")
|
||||
/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = MELEE)
|
||||
var/temp_damage = damage
|
||||
if(!damage_coeff[damagetype])
|
||||
temp_damage = 0
|
||||
@@ -124,10 +124,10 @@
|
||||
apply_damage(damage, damagetype, null, getarmor(null, armorcheck))
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj)
|
||||
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj, def_zone, piercing_hit = FALSE)
|
||||
if(!Proj)
|
||||
return
|
||||
apply_damage(Proj.damage, Proj.damage_type)
|
||||
apply_damage(Proj.damage, Proj.damage_type, 0, piercing_hit)
|
||||
Proj.on_hit(src)
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
|
||||
return
|
||||
..()
|
||||
var/bomb_armor = getarmor(null, "bomb")
|
||||
var/bomb_armor = getarmor(null, BOMB)
|
||||
switch (severity)
|
||||
if (EXPLODE_DEVASTATE)
|
||||
if(prob(bomb_armor))
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
playsound(src,'sound/effects/beepskyspinsabre.ogg',100,TRUE,-1)
|
||||
stun_attack(AM)
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/grievous/Initialize()
|
||||
/mob/living/simple_animal/bot/secbot/grievous/Initialize(mapload)
|
||||
. = ..()
|
||||
weapon = new baton_type(src)
|
||||
INVOKE_ASYNC(weapon, /obj/item.proc/attack_self, src)
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
bot_reset() //Resets an AI's call, should it exist.
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/bot/Initialize()
|
||||
/mob/living/simple_animal/bot/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.bots_list += src
|
||||
access_card = new /obj/item/card/id(src)
|
||||
@@ -285,7 +285,7 @@
|
||||
call_mode()
|
||||
return
|
||||
if(BOT_SUMMON) //Called by PDA
|
||||
bot_summon()
|
||||
summon_step()
|
||||
return
|
||||
return TRUE //Successful completion. Used to prevent child process() continuing if this one is ended early.
|
||||
|
||||
@@ -731,8 +731,6 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
mode = BOT_SUMMON
|
||||
speak("Responding.", radio_channel)
|
||||
|
||||
calc_summon_path()
|
||||
|
||||
if("ejectpai")
|
||||
ejectpairemote(user)
|
||||
return
|
||||
@@ -759,9 +757,6 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Unidentified control sequence received:[command]</span>")
|
||||
|
||||
/mob/living/simple_animal/bot/proc/bot_summon() // summoned to PDA
|
||||
summon_step()
|
||||
|
||||
// calculates a path to the current destination
|
||||
// given an optional turf to avoid
|
||||
/mob/living/simple_animal/bot/proc/calc_path(turf/avoid)
|
||||
@@ -876,7 +871,7 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
anchored = FALSE
|
||||
var/mob/living/simple_animal/bot/owner = null
|
||||
|
||||
/obj/machinery/bot_core/Initialize()
|
||||
/obj/machinery/bot_core/Initialize(mapload)
|
||||
. = ..()
|
||||
owner = loc
|
||||
if(!istype(owner))
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
if(ascended && user.stat == CONSCIOUS && user.client)
|
||||
user.client.give_award(/datum/award/achievement/misc/cleanboss, user)
|
||||
|
||||
/mob/living/simple_animal/bot/cleanbot/Initialize()
|
||||
/mob/living/simple_animal/bot/cleanbot/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
chosen_name = name
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
created_name = "Floorbot"
|
||||
var/toolbox = /obj/item/storage/toolbox
|
||||
|
||||
/obj/item/bot_assembly/floorbot/Initialize()
|
||||
/obj/item/bot_assembly/floorbot/Initialize(mapload)
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
@@ -277,7 +277,7 @@
|
||||
var/healthanalyzer = /obj/item/healthanalyzer
|
||||
var/firstaid = /obj/item/storage/firstaid
|
||||
|
||||
/obj/item/bot_assembly/medbot/Initialize()
|
||||
/obj/item/bot_assembly/medbot/Initialize(mapload)
|
||||
. = ..()
|
||||
spawn(5)
|
||||
if(skin)
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
var/extinguish_fires = TRUE
|
||||
var/stationary_mode = FALSE
|
||||
|
||||
/mob/living/simple_animal/bot/firebot/Initialize()
|
||||
/mob/living/simple_animal/bot/firebot/Initialize(mapload)
|
||||
. = ..()
|
||||
update_icon()
|
||||
var/datum/job/engineer/J = new/datum/job/engineer
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
#define REPLACE_TILE 6
|
||||
#define TILE_EMAG 7
|
||||
|
||||
/mob/living/simple_animal/bot/floorbot/Initialize()
|
||||
/mob/living/simple_animal/bot/floorbot/Initialize(mapload)
|
||||
. = ..()
|
||||
update_icon()
|
||||
var/datum/job/engineer/J = new/datum/job/engineer
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
var/weaponscheck = TRUE
|
||||
var/bikehorn = /obj/item/bikehorn
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/Initialize()
|
||||
/mob/living/simple_animal/bot/honkbot/Initialize(mapload)
|
||||
. = ..()
|
||||
update_icon()
|
||||
auto_patrol = TRUE
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
var/obj/item/stock_parts/cell/cell
|
||||
var/bloodiness = 0
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/Initialize()
|
||||
/mob/living/simple_animal/bot/mulebot/Initialize(mapload)
|
||||
. = ..()
|
||||
wires = new /datum/wires/mulebot(src)
|
||||
var/datum/job/cargo_tech/J = new/datum/job/cargo_tech
|
||||
@@ -631,12 +631,12 @@
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
|
||||
var/damage = rand(5,15)
|
||||
H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, "melee"))
|
||||
H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, "melee"))
|
||||
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, "melee"))
|
||||
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, "melee"))
|
||||
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, "melee"))
|
||||
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, "melee"))
|
||||
H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, MELEE))
|
||||
H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, MELEE))
|
||||
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, MELEE))
|
||||
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, MELEE))
|
||||
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, MELEE))
|
||||
H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, MELEE))
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
T.add_mob_blood(H)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
name = "Officer Pipsqueak"
|
||||
desc = "It's Officer Beep O'sky's smaller, just-as aggressive cousin, Pipsqueak."
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize()
|
||||
/mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize(mapload)
|
||||
. = ..()
|
||||
resize = 0.8
|
||||
update_transform()
|
||||
@@ -174,7 +174,7 @@
|
||||
desc = "It's Officer Pingsky! Delegated to satellite guard duty for harbouring anti-human sentiment."
|
||||
radio_channel = RADIO_CHANNEL_AI_PRIVATE
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/Initialize()
|
||||
/mob/living/simple_animal/bot/secbot/Initialize(mapload)
|
||||
. = ..()
|
||||
update_icon()
|
||||
var/datum/job/detective/J = new/datum/job/detective
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
var/runetype
|
||||
var/datum/mind/original_mind
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/Initialize()
|
||||
/mob/living/simple_animal/hostile/construct/Initialize(mapload)
|
||||
. = ..()
|
||||
update_health_hud()
|
||||
var/spellnum = 1
|
||||
@@ -382,7 +382,7 @@
|
||||
return FALSE
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/construct/harvester/Initialize()
|
||||
/mob/living/simple_animal/hostile/construct/harvester/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/action/innate/seek_prey/seek = new()
|
||||
seek.Grant(src)
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
///Innate spells that are supposed to be added when a beast is created
|
||||
var/list/spells_to_add
|
||||
|
||||
/mob/living/simple_animal/hostile/eldritch/Initialize()
|
||||
/mob/living/simple_animal/hostile/eldritch/Initialize(mapload)
|
||||
. = ..()
|
||||
add_spells()
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
var/list/linked_mobs = list()
|
||||
|
||||
/mob/living/simple_animal/hostile/eldritch/raw_prophet/Initialize()
|
||||
/mob/living/simple_animal/hostile/eldritch/raw_prophet/Initialize(mapload)
|
||||
. = ..()
|
||||
link_mob(src)
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
speak_chance = 1
|
||||
unique_name = FALSE
|
||||
|
||||
/mob/living/simple_animal/pet/bumbles/Initialize()
|
||||
/mob/living/simple_animal/pet/bumbles/Initialize(mapload)
|
||||
. = ..()
|
||||
add_verb(src, /mob/living/proc/lay_down)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
verb_exclaim = "flutters intensely"
|
||||
verb_yell = "flutters intensely"
|
||||
|
||||
/mob/living/simple_animal/butterfly/Initialize()
|
||||
/mob/living/simple_animal/butterfly/Initialize(mapload)
|
||||
. = ..()
|
||||
var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
|
||||
add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
var/held_icon = "cat2"
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
|
||||
/mob/living/simple_animal/pet/cat/Initialize()
|
||||
/mob/living/simple_animal/pet/cat/Initialize(mapload)
|
||||
. = ..()
|
||||
add_verb(src, /mob/living/proc/lay_down)
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
@@ -107,7 +107,7 @@
|
||||
var/cats_deployed = 0
|
||||
var/memory_saved = FALSE
|
||||
|
||||
/mob/living/simple_animal/pet/cat/Runtime/Initialize()
|
||||
/mob/living/simple_animal/pet/cat/Runtime/Initialize(mapload)
|
||||
if(prob(5))
|
||||
icon_state = "original"
|
||||
icon_living = "original"
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
var/squish_chance = 50
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/cockroach/Initialize()
|
||||
/mob/living/simple_animal/cockroach/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
var/obj/item/inventory_mask
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
|
||||
/mob/living/simple_animal/crab/Initialize()
|
||||
/mob/living/simple_animal/crab/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
animal_species = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi
|
||||
nofur = TRUE
|
||||
|
||||
/mob/living/simple_animal/pet/dog/Initialize()
|
||||
/mob/living/simple_animal/pet/dog/Initialize(mapload)
|
||||
. = ..()
|
||||
var/dog_area = get_area(src)
|
||||
for(var/obj/structure/bed/dogbed/D in dog_area)
|
||||
@@ -92,11 +92,11 @@
|
||||
D.update_owner(src)
|
||||
break
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/Initialize()
|
||||
/mob/living/simple_animal/pet/dog/corgi/Initialize(mapload)
|
||||
. = ..()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi/Initialize()
|
||||
/mob/living/simple_animal/pet/dog/corgi/exoticcorgi/Initialize(mapload)
|
||||
. = ..()
|
||||
var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
|
||||
add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
|
||||
@@ -400,7 +400,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
|
||||
var/memory_saved = FALSE
|
||||
var/saved_head //path
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/Ian/Initialize()
|
||||
/mob/living/simple_animal/pet/dog/corgi/Ian/Initialize(mapload)
|
||||
. = ..()
|
||||
//parent call must happen first to ensure IAN
|
||||
//is not in nullspace when child puppies spawn
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
"<span class='warning'>These rules are at admin discretion and will be heavily enforced.</span>\n"+\
|
||||
"<span class='warning'><u>If you do not have the regular drone laws, follow your laws to the best of your ability.</u></span>"
|
||||
|
||||
/mob/living/simple_animal/drone/Initialize()
|
||||
/mob/living/simple_animal/drone/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.drones_list += src
|
||||
access_card = new /obj/item/card/id(src)
|
||||
@@ -140,6 +140,12 @@
|
||||
if(!picked)
|
||||
pickVisualAppearence()
|
||||
|
||||
/mob/living/simple_animal/drone/auto_deadmin_on_login()
|
||||
if(!client?.holder)
|
||||
return TRUE
|
||||
if(CONFIG_GET(flag/auto_deadmin_silicons) || (client.prefs?.deadmin & DEADMIN_POSITION_SILICON))
|
||||
return client.holder.auto_deadmin()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/drone/death(gibbed)
|
||||
..(gibbed)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/seasonal_hats = TRUE //If TRUE, and there are no default hats, different holidays will grant different hats
|
||||
var/static/list/possible_seasonal_hats //This is built automatically in build_seasonal_hats() but can also be edited by admins!
|
||||
|
||||
/obj/item/drone_shell/Initialize()
|
||||
/obj/item/drone_shell/Initialize(mapload)
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
hacked = TRUE
|
||||
flavortext = null
|
||||
|
||||
/mob/living/simple_animal/drone/syndrone/Initialize()
|
||||
/mob/living/simple_animal/drone/syndrone/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink)
|
||||
hidden_uplink.telecrystals = 10
|
||||
@@ -45,7 +45,7 @@
|
||||
default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
|
||||
default_storage = /obj/item/uplink/nuclear
|
||||
|
||||
/mob/living/simple_animal/drone/syndrone/badass/Initialize()
|
||||
/mob/living/simple_animal/drone/syndrone/badass/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink)
|
||||
hidden_uplink.telecrystals = 30
|
||||
@@ -55,7 +55,7 @@
|
||||
/mob/living/simple_animal/drone/snowflake
|
||||
default_hatmask = /obj/item/clothing/head/chameleon/drone
|
||||
|
||||
/mob/living/simple_animal/drone/snowflake/Initialize()
|
||||
/mob/living/simple_animal/drone/snowflake/Initialize(mapload)
|
||||
. = ..()
|
||||
desc += " This drone appears to have a complex holoprojector built on its 'head'."
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
default_hatmask = null
|
||||
picked = TRUE
|
||||
|
||||
/mob/living/simple_animal/drone/polymorphed/Initialize()
|
||||
/mob/living/simple_animal/drone/polymorphed/Initialize(mapload)
|
||||
. = ..()
|
||||
liberate()
|
||||
visualAppearence = pick(MAINTDRONE, REPAIRDRONE, SCOUTDRONE)
|
||||
@@ -136,7 +136,7 @@
|
||||
/mob/living/simple_animal/drone/cogscarab/admin //an admin-only subtype of cogscarab with a no-cost fabricator and slab in its box
|
||||
default_storage = /obj/item/storage/toolbox/brass/prefilled/ratvar/admin
|
||||
|
||||
/mob/living/simple_animal/drone/cogscarab/Initialize()
|
||||
/mob/living/simple_animal/drone/cogscarab/Initialize(mapload)
|
||||
. = ..()
|
||||
set_light(2, 0.5)
|
||||
qdel(access_card) //we don't have free access
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/goat/Initialize(/datum/reagent/milk_reagent)
|
||||
/mob/living/simple_animal/hostile/retaliate/goat/Initialize(mapload, /datum/reagent/milk_reagent)
|
||||
udder = new (null, milk_reagent)
|
||||
. = ..()
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_SHOE
|
||||
|
||||
/mob/living/simple_animal/cow/Initialize()
|
||||
/mob/living/simple_animal/cow/Initialize(mapload)
|
||||
udder = new(null, milk_reagent)
|
||||
. = ..()
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
name = "strange cow"
|
||||
desc = "Something seems off about the milk this cow is producing."
|
||||
|
||||
/mob/living/simple_animal/cow/random/Initialize()
|
||||
/mob/living/simple_animal/cow/random/Initialize(mapload)
|
||||
milk_reagent = get_random_reagent_id() //this has a blacklist so don't worry about romerol cows, etc
|
||||
..()
|
||||
|
||||
@@ -210,7 +210,7 @@
|
||||
speak_chance = 10 //the cow is eager to share its wisdom! //but is wise enough to not lag the server too bad
|
||||
milk_reagent = /datum/reagent/medicine/liquid_wisdom
|
||||
|
||||
/mob/living/simple_animal/cow/wisdom/Initialize()
|
||||
/mob/living/simple_animal/cow/wisdom/Initialize(mapload)
|
||||
. = ..()
|
||||
speak = GLOB.wisdoms //Done here so it's setup properly
|
||||
|
||||
@@ -248,7 +248,7 @@
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
|
||||
/mob/living/simple_animal/chick/Initialize()
|
||||
/mob/living/simple_animal/chick/Initialize(mapload)
|
||||
. = ..()
|
||||
pixel_x = rand(-6, 6)
|
||||
pixel_y = rand(0, 10)
|
||||
@@ -310,7 +310,7 @@
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
|
||||
/mob/living/simple_animal/chicken/Initialize()
|
||||
/mob/living/simple_animal/chicken/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!body_color)
|
||||
body_color = pick(validColors)
|
||||
@@ -408,7 +408,7 @@
|
||||
--kiwi_count
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/kiwi/Initialize()
|
||||
/mob/living/simple_animal/kiwi/Initialize(mapload)
|
||||
. = ..()
|
||||
++kiwi_count
|
||||
|
||||
@@ -482,7 +482,7 @@
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
|
||||
/mob/living/simple_animal/babyKiwi/Initialize()
|
||||
/mob/living/simple_animal/babyKiwi/Initialize(mapload)
|
||||
. = ..()
|
||||
pixel_x = rand(-6, 6)
|
||||
pixel_y = rand(0, 10)
|
||||
@@ -506,7 +506,7 @@
|
||||
/obj/item/udder
|
||||
name = "udder"
|
||||
|
||||
/obj/item/udder/Initialize(loc, milk_reagent)
|
||||
/obj/item/udder/Initialize(mapload, loc, milk_reagent)
|
||||
if(!milk_reagent)
|
||||
milk_reagent = /datum/reagent/consumable/milk
|
||||
create_reagents(50, NONE, NO_REAGENTS_VALUE)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
//Gondolas don't make footstep sounds
|
||||
|
||||
/mob/living/simple_animal/pet/gondola/Initialize()
|
||||
/mob/living/simple_animal/pet/gondola/Initialize(mapload)
|
||||
. = ..()
|
||||
if (!(istype(src, /mob/living/simple_animal/pet/gondola/gondolapod)))
|
||||
CreateGondola()
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
var/chew_probability = 1
|
||||
faction = list("rat")
|
||||
|
||||
/mob/living/simple_animal/mouse/Initialize()
|
||||
/mob/living/simple_animal/mouse/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/squeak, list('sound/effects/mousesqueek.ogg'=1), 100)
|
||||
if(!body_color)
|
||||
@@ -174,7 +174,7 @@ GLOBAL_VAR(tom_existed)
|
||||
desc = "Jerry the cat is not amused."
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
|
||||
/mob/living/simple_animal/mouse/brown/Tom/Initialize()
|
||||
/mob/living/simple_animal/mouse/brown/Tom/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.tom_existed = TRUE
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/pet/Initialize()
|
||||
/mob/living/simple_animal/pet/Initialize(mapload)
|
||||
. = ..()
|
||||
if(pcollar)
|
||||
pcollar = new(src)
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
mob_biotypes = MOB_ORGANIC|MOB_BEAST
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
|
||||
/mob/living/simple_animal/opossum/Initialize()
|
||||
/mob/living/simple_animal/opossum/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/snake/Initialize()
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/snake/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ GLOBAL_LIST(bad_gremlin_items)
|
||||
var/list/hear_memory = list()
|
||||
var/const/max_hear_memory = 20
|
||||
|
||||
/mob/living/simple_animal/hostile/gremlin/Initialize()
|
||||
/mob/living/simple_animal/hostile/gremlin/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
ADD_TRAIT(src, TRAIT_SHOCKIMMUNE, INNATE_TRAIT)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/atom/movable/screen/alert/canstealthalert
|
||||
var/atom/movable/screen/alert/instealthalert
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/assassin/Initialize()
|
||||
/mob/living/simple_animal/hostile/guardian/assassin/Initialize(mapload)
|
||||
. = ..()
|
||||
stealthcooldown = 0
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
var/beacon_cooldown = 0
|
||||
var/toggle = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/guardian/healer/Initialize()
|
||||
/mob/living/simple_animal/hostile/guardian/healer/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
medsensor.add_hud_to(src)
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
death_sound = 'sound/voice/hiss6.ogg'
|
||||
deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..."
|
||||
|
||||
/mob/living/simple_animal/hostile/alien/Initialize()
|
||||
/mob/living/simple_animal/hostile/alien/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW)
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
melee_damage_upper = 20
|
||||
del_on_death = TRUE
|
||||
loot = list(/obj/effect/mob_spawn/alien/corpse/humanoid/sentinel)
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/alien/queen
|
||||
name = "alien queen"
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
var/projectile_density = TRUE //griffons get shot
|
||||
del_on_death = TRUE
|
||||
|
||||
/mob/living/simple_animal/banana_spider/Initialize()
|
||||
/mob/living/simple_animal/banana_spider/Initialize(mapload)
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
@@ -105,6 +105,6 @@
|
||||
juice_results = list(/datum/reagent/consumable/banana = 0)
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/deadbanana_spider/Initialize()
|
||||
/obj/item/reagent_containers/food/snacks/deadbanana_spider/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/slippery, 20)
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics)
|
||||
var/held_icon = "" // bees are small and have no held icon (aka the coder doesn't know how to sprite it)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Initialize()
|
||||
/mob/living/simple_animal/hostile/poison/bees/Initialize(mapload)
|
||||
. = ..()
|
||||
generate_bee_visuals()
|
||||
AddComponent(/datum/component/swarming)
|
||||
@@ -211,7 +211,7 @@
|
||||
beehome = BB
|
||||
break // End loop after the first compatible find.
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/toxin/Initialize()
|
||||
/mob/living/simple_animal/hostile/poison/bees/toxin/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/reagent/R = pick(typesof(/datum/reagent/toxin))
|
||||
assign_reagent(GLOB.chemical_reagents_list[R])
|
||||
@@ -289,7 +289,7 @@
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/queen_bee/bought/Initialize()
|
||||
/obj/item/queen_bee/bought/Initialize(mapload)
|
||||
. = ..()
|
||||
queen = new(src)
|
||||
|
||||
@@ -310,6 +310,6 @@
|
||||
/mob/living/simple_animal/hostile/poison/bees/short
|
||||
desc = "These bees seem unstable and won't survive for long."
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/short/Initialize()
|
||||
/mob/living/simple_animal/hostile/poison/bees/short/Initialize(mapload)
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/death), 50 SECONDS)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/point_regen_amount = 1
|
||||
sentience_type = SENTIENCE_BOSS
|
||||
|
||||
/mob/living/simple_animal/hostile/boss/Initialize()
|
||||
/mob/living/simple_animal/hostile/boss/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
atb = new()
|
||||
|
||||
@@ -182,7 +182,7 @@
|
||||
duration = 18
|
||||
randomdir = FALSE
|
||||
|
||||
/obj/effect/temp_visual/paperwiz_dying/Initialize()
|
||||
/obj/effect/temp_visual/paperwiz_dying/Initialize(mapload)
|
||||
. = ..()
|
||||
visible_message("<span class='boldannounce'>The wizard cries out in pain as a gate appears behind him, sucking him in!</span>")
|
||||
playsound(get_turf(src),'sound/magic/mandswap.ogg', 50, 1, 1)
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
verb_yell = "growls loudly"
|
||||
del_on_death = TRUE
|
||||
|
||||
/mob/living/simple_animal/bread/hostile/Initialize()
|
||||
/mob/living/simple_animal/bread/hostile/Initialize(mapload)
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/megacarp/Initialize()
|
||||
/mob/living/simple_animal/hostile/carp/megacarp/Initialize(mapload)
|
||||
. = ..()
|
||||
name = "[pick(GLOB.megacarp_first_names)] [pick(GLOB.megacarp_last_names)]"
|
||||
melee_damage_lower += rand(4, 10)
|
||||
@@ -109,7 +109,7 @@
|
||||
/// Colored disk mouth appearance for adding it as a mouth overlay
|
||||
var/mutable_appearance/colored_disk_mouth
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/cayenne/Initialize()
|
||||
/mob/living/simple_animal/hostile/carp/cayenne/Initialize(mapload)
|
||||
. = ..()
|
||||
// AddElement(/datum/element/pet_bonus, "bloops happily!")
|
||||
// colored_disk_mouth = mutable_appearance(SSgreyscale.GetColoredIconByType(/datum/greyscale_config/carp/disk_mouth, greyscale_colors), "disk_mouth")
|
||||
|
||||
@@ -37,4 +37,4 @@
|
||||
icon_state = "declone"
|
||||
damage = 4
|
||||
damage_type = BURN
|
||||
flag = "energy"
|
||||
flag = ENERGY
|
||||
|
||||
@@ -49,7 +49,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0)
|
||||
hud_possible = list(ANTAG_HUD)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/Initialize()
|
||||
/mob/living/simple_animal/hostile/floor_cluwne/Initialize(mapload)
|
||||
. = ..()
|
||||
access_card = new /obj/item/card/id(src)
|
||||
var/datum/job/captain/C = new /datum/job/captain
|
||||
@@ -431,7 +431,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0)
|
||||
duration = 600
|
||||
randomdir = FALSE
|
||||
|
||||
/obj/effect/temp_visual/fcluwne_manifest/Initialize()
|
||||
/obj/effect/temp_visual/fcluwne_manifest/Initialize(mapload)
|
||||
. = ..()
|
||||
playsound(src, 'sound/misc/floor_cluwne_emerge.ogg', 100, 1)
|
||||
flick("fcluwne_manifest",src)
|
||||
@@ -440,7 +440,7 @@ GLOBAL_VAR_INIT(floor_cluwnes, 0)
|
||||
name = "floor cluwne"
|
||||
desc = "If you have this, tell a coder or admin!"
|
||||
|
||||
/obj/effect/dummy/floorcluwne_orbit/Initialize()
|
||||
/obj/effect/dummy/floorcluwne_orbit/Initialize(mapload)
|
||||
. = ..()
|
||||
GLOB.floor_cluwnes++
|
||||
name += " ([GLOB.floor_cluwnes])"
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
var/datum/action/innate/spider/lay_web/lay_web
|
||||
var/directive = "" //Message passed down to children, to relay the creator's orders
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Initialize()
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/Initialize(mapload)
|
||||
. = ..()
|
||||
lay_web = new
|
||||
lay_web.Grant(src)
|
||||
@@ -122,7 +122,7 @@
|
||||
var/datum/action/innate/spider/set_directive/set_directive
|
||||
var/static/list/consumed_mobs = list() //the tags of mobs that have been consumed by nurse spiders to lay eggs
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize()
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize(mapload)
|
||||
. = ..()
|
||||
wrap = new
|
||||
AddAbility(wrap)
|
||||
@@ -208,7 +208,7 @@
|
||||
var/datum/action/innate/spider/comm/letmetalkpls
|
||||
gold_core_spawnable = NO_SPAWN
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize()
|
||||
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Initialize(mapload)
|
||||
. = ..()
|
||||
letmetalkpls = new
|
||||
letmetalkpls.Grant(src)
|
||||
@@ -396,7 +396,7 @@
|
||||
action_icon_state = "wrap_0"
|
||||
action_background_icon_state = "bg_alien"
|
||||
|
||||
/obj/effect/proc_holder/wrap/Initialize()
|
||||
/obj/effect/proc_holder/wrap/Initialize(mapload)
|
||||
. = ..()
|
||||
action = new(src)
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
var/egg_lain = 0
|
||||
gold_core_spawnable = NO_SPAWN //are you sure about this?? // CITADEL CHANGE, Yes.
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/Initialize()
|
||||
/mob/living/simple_animal/hostile/headcrab/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
|
||||
/mob/living/simple_animal/hostile/hivebot/Initialize()
|
||||
/mob/living/simple_animal/hostile/hivebot/Initialize(mapload)
|
||||
. = ..()
|
||||
deathmessage = "[src] blows apart!"
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
///Declares a cooldown for potential charges right off the bat.
|
||||
COOLDOWN_DECLARE(charge_cooldown)
|
||||
|
||||
/mob/living/simple_animal/hostile/Initialize()
|
||||
/mob/living/simple_animal/hostile/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
if(!targets_from)
|
||||
@@ -146,7 +146,7 @@
|
||||
if(!search_objects)
|
||||
. = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
|
||||
|
||||
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
|
||||
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha, /obj/structure/destructible/clockwork/ocular_warden,/obj/item/electronic_assembly))
|
||||
|
||||
for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines))
|
||||
if(can_see(targets_from, HM, vision_range))
|
||||
@@ -236,9 +236,9 @@
|
||||
return TRUE
|
||||
|
||||
if(ismecha(the_target))
|
||||
var/obj/mecha/M = the_target
|
||||
if(M.occupant)//Just so we don't attack empty mechs
|
||||
if(CanAttack(M.occupant))
|
||||
var/obj/vehicle/sealed/mecha/M = the_target
|
||||
for(var/occupant in M.occupants)
|
||||
if(CanAttack(occupant))
|
||||
return TRUE
|
||||
|
||||
if(istype(the_target, /obj/machinery/porta_turret))
|
||||
@@ -604,7 +604,7 @@
|
||||
toggle_ai(AI_ON)
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/ListTargetsLazy(var/_Z)//Step 1, find out what we can see
|
||||
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha, /obj/structure/destructible/clockwork/ocular_warden))
|
||||
var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha, /obj/structure/destructible/clockwork/ocular_warden))
|
||||
. = list()
|
||||
for (var/I in SSmobs.clients_by_zlevel[_Z])
|
||||
var/mob/M = I
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
layer = ABOVE_ALL_MOB_LAYER
|
||||
duration = 3
|
||||
|
||||
/obj/effect/temp_visual/leaper_projectile_impact/Initialize()
|
||||
/obj/effect/temp_visual/leaper_projectile_impact/Initialize(mapload)
|
||||
. = ..()
|
||||
new /obj/effect/decal/cleanable/leaper_sludge(get_turf(src))
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
max_integrity = 10
|
||||
density = FALSE
|
||||
|
||||
/obj/structure/leaper_bubble/Initialize()
|
||||
/obj/structure/leaper_bubble/Initialize(mapload)
|
||||
. = ..()
|
||||
INVOKE_ASYNC(src, /atom/movable.proc/float, TRUE)
|
||||
QDEL_IN(src, 100)
|
||||
@@ -126,7 +126,7 @@
|
||||
pixel_y = -32
|
||||
duration = 30
|
||||
|
||||
/mob/living/simple_animal/hostile/jungle/leaper/Initialize()
|
||||
/mob/living/simple_animal/hostile/jungle/leaper/Initialize(mapload)
|
||||
. = ..()
|
||||
remove_verb(src, /mob/living/verb/pulled)
|
||||
|
||||
|
||||
@@ -33,12 +33,12 @@
|
||||
|
||||
footstep_type = FOOTSTEP_MOB_BAREFOOT
|
||||
|
||||
/mob/living/simple_animal/hostile/jungle/mook/CanPass(atom/movable/O)
|
||||
/mob/living/simple_animal/hostile/jungle/mook/CanAllowThrough(atom/movable/O)
|
||||
. = ..()
|
||||
if(istype(O, /mob/living/simple_animal/hostile/jungle/mook))
|
||||
var/mob/living/simple_animal/hostile/jungle/mook/M = O
|
||||
if(M.attack_state == MOOK_ATTACK_ACTIVE && M.throwing)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/jungle/mook/death()
|
||||
desc = "A deceased primitive. Upon closer inspection, it was suffering from severe cellular degeneration and its garments are machine made..."//Can you guess the twist
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
damage = 10
|
||||
damage_type = BURN
|
||||
light_range = 2
|
||||
flag = "energy"
|
||||
flag = ENERGY
|
||||
light_color = LIGHT_COLOR_YELLOW
|
||||
hitsound = 'sound/weapons/sear.ogg'
|
||||
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
|
||||
|
||||
@@ -29,6 +29,6 @@
|
||||
maxbodytemp = 500
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
|
||||
/mob/living/simple_animal/hostile/killertomato/Initialize()
|
||||
/mob/living/simple_animal/hostile/killertomato/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS)
|
||||
|
||||
@@ -25,14 +25,14 @@
|
||||
search_objects = 0
|
||||
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
|
||||
|
||||
var/spawn_mecha_type = /obj/mecha/combat/marauder/mauler/loaded
|
||||
var/obj/mecha/mecha //Ref to pilot's mecha instance
|
||||
var/spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/mauler/loaded
|
||||
var/obj/vehicle/sealed/mecha/mecha //Ref to pilot's mecha instance
|
||||
var/required_mecha_charge = 7500 //If the pilot doesn't have a mecha, what charge does a potential Grand Theft Mecha need? (Defaults to half a battery)
|
||||
var/mecha_charge_evacuate = 50 //Amount of charge at which the pilot tries to abandon the mecha
|
||||
|
||||
//Vars that control when the pilot uses their mecha's abilities (if the mecha has that ability)
|
||||
var/threat_use_mecha_smoke = 5 //5 mobs is enough to engage crowd control
|
||||
var/defence_mode_chance = 35 //Chance to engage Defence mode when damaged
|
||||
var/defense_mode_chance = 35 //Chance to engage Defense mode when damaged
|
||||
var/smoke_chance = 20 //Chance to deploy smoke for crowd control
|
||||
var/retreat_chance = 40 //Chance to run away
|
||||
|
||||
@@ -40,35 +40,35 @@
|
||||
spawn_mecha_type = null
|
||||
search_objects = 2
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize()
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize(mapload)
|
||||
. = ..()
|
||||
wanted_objects = typecacheof(/obj/mecha/combat, TRUE)
|
||||
wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path.
|
||||
name = "Nanotrasen Mecha Pilot"
|
||||
name = "\improper Nanotrasen Mecha Pilot"
|
||||
desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
|
||||
icon_living = "nanotrasen"
|
||||
icon_state = "nanotrasen"
|
||||
faction = list("nanotrasen")
|
||||
spawn_mecha_type = /obj/mecha/combat/marauder/loaded
|
||||
spawn_mecha_type = /obj/vehicle/sealed/mecha/combat/marauder/loaded
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen
|
||||
name = "Nanotrasen Mecha Pilot"
|
||||
name = "\improper Nanotrasen Mecha Pilot"
|
||||
desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour."
|
||||
icon_living = "nanotrasen"
|
||||
icon_state = "nanotrasen"
|
||||
faction = list("nanotrasen")
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize()
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize(mapload)
|
||||
. = ..()
|
||||
if(spawn_mecha_type)
|
||||
var/obj/mecha/M = new spawn_mecha_type (get_turf(src))
|
||||
var/obj/vehicle/sealed/mecha/M = new spawn_mecha_type (get_turf(src))
|
||||
if(istype(M))
|
||||
enter_mecha(M)
|
||||
INVOKE_ASYNC(src, .proc/enter_mecha, M)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M)
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/vehicle/sealed/mecha/M)
|
||||
if(!M)
|
||||
return 0
|
||||
target = null //Target was our mecha, so null it out
|
||||
@@ -78,7 +78,7 @@
|
||||
var/do_ranged = 0
|
||||
for(var/equip in mecha.equipment)
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = equip
|
||||
if(ME.range & RANGED)
|
||||
if(ME.range & MECHA_RANGED)
|
||||
do_ranged = 1
|
||||
break
|
||||
if(do_ranged)
|
||||
@@ -89,11 +89,11 @@
|
||||
ranged = 0
|
||||
wanted_objects = list()
|
||||
search_objects = 0
|
||||
if(mecha && mecha.lights_action) //an AI mecha is an EVIL EVIL thing, so let's not hide them in the dark
|
||||
mecha.lights_action.Activate()
|
||||
if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode)
|
||||
var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode]
|
||||
action.Trigger(TRUE)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/mecha/M)
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/vehicle/sealed/mecha/M)
|
||||
if(!M)
|
||||
return 0
|
||||
|
||||
@@ -102,9 +102,9 @@
|
||||
targets_from = src
|
||||
|
||||
//Find a new mecha
|
||||
wanted_objects = typecacheof(/obj/mecha/combat, TRUE)
|
||||
wanted_objects = typecacheof(/obj/vehicle/sealed/mecha/combat, TRUE)
|
||||
var/search_aggressiveness = 2
|
||||
for(var/obj/mecha/combat/C in range(vision_range,src))
|
||||
for(var/obj/vehicle/sealed/mecha/combat/C in range(vision_range,src))
|
||||
if(is_valid_mecha(C))
|
||||
target = C
|
||||
search_aggressiveness = 3 //We can see a mech? RUN FOR IT, IGNORE MOBS!
|
||||
@@ -116,23 +116,23 @@
|
||||
walk(M,0)//end any lingering movement loops, to prevent the haunted mecha bug
|
||||
|
||||
//Checks if a mecha is valid for theft
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M)
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/vehicle/sealed/mecha/M)
|
||||
if(!M)
|
||||
return 0
|
||||
if(M.occupant)
|
||||
return 0
|
||||
return FALSE
|
||||
if(LAZYLEN(M.occupants))
|
||||
return FALSE
|
||||
if(!M.has_charge(required_mecha_charge))
|
||||
return 0
|
||||
return FALSE
|
||||
if(M.obj_integrity < M.max_integrity*0.5)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_face_target(atom/A)
|
||||
if(mecha)
|
||||
var/dirto = get_dir(mecha,A)
|
||||
if(mecha.dir != dirto) //checking, because otherwise the mecha makes too many turn noises
|
||||
mecha.mechturn(dirto)
|
||||
mecha.vehicle_move(dirto, TRUE)
|
||||
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
ME.rearm()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = RANGED)
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED)
|
||||
. = list()
|
||||
if(mecha)
|
||||
for(var/equip in mecha.equipment)
|
||||
@@ -160,11 +160,10 @@
|
||||
if(mecha)
|
||||
mecha_reload()
|
||||
mecha_face_target(A)
|
||||
var/list/possible_weapons = get_mecha_equip_by_flag(RANGED)
|
||||
var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_RANGED)
|
||||
if(possible_weapons.len)
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) //so we don't favor mecha.equipment[1] forever
|
||||
if(ME.action(A))
|
||||
ME.start_cooldown()
|
||||
if(ME.action(src,A))
|
||||
return
|
||||
|
||||
else
|
||||
@@ -173,20 +172,19 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget()
|
||||
if(mecha)
|
||||
var/list/possible_weapons = get_mecha_equip_by_flag(MELEE)
|
||||
var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE)
|
||||
if(possible_weapons.len)
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons)
|
||||
mecha_face_target(target)
|
||||
if(ME.action(target))
|
||||
ME.start_cooldown()
|
||||
if(ME.action(src,target))
|
||||
return
|
||||
|
||||
if(mecha.melee_can_hit)
|
||||
if(!TIMER_COOLDOWN_CHECK(mecha, COOLDOWN_MECHA_MELEE_ATTACK))
|
||||
mecha_face_target(target)
|
||||
target.mech_melee_attack(mecha)
|
||||
target.mech_melee_attack(mecha, src)
|
||||
else
|
||||
if(ismecha(target))
|
||||
var/obj/mecha/M = target
|
||||
var/obj/vehicle/sealed/mecha/M = target
|
||||
if(is_valid_mecha(M))
|
||||
enter_mecha(M)
|
||||
return
|
||||
@@ -199,50 +197,54 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action()
|
||||
if(..())
|
||||
if(!mecha)
|
||||
for(var/obj/mecha/combat/C in range(src,vision_range))
|
||||
if(is_valid_mecha(C))
|
||||
target = C //Let's nab it!
|
||||
minimum_distance = 1
|
||||
ranged = 0
|
||||
break
|
||||
if(mecha)
|
||||
var/list/L = PossibleThreats()
|
||||
var/threat_count = L.len
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(!mecha)
|
||||
for(var/obj/vehicle/sealed/mecha/combat/mecha_in_range in range(src,vision_range))
|
||||
if(is_valid_mecha(mecha_in_range))
|
||||
target = mecha_in_range //Let's nab it!
|
||||
minimum_distance = 1
|
||||
ranged = 0
|
||||
break
|
||||
if(mecha)
|
||||
var/list/L = PossibleThreats()
|
||||
var/threat_count = L.len
|
||||
|
||||
//Low Charge - Eject
|
||||
if(!mecha.has_charge(mecha_charge_evacuate))
|
||||
exit_mecha(mecha)
|
||||
return
|
||||
//Low Charge - Eject
|
||||
if(!mecha.has_charge(mecha_charge_evacuate))
|
||||
exit_mecha(mecha)
|
||||
return
|
||||
|
||||
//Too Much Damage - Eject
|
||||
if(mecha.obj_integrity < mecha.max_integrity*0.1)
|
||||
exit_mecha(mecha)
|
||||
return
|
||||
if(mecha.obj_integrity < mecha.max_integrity*0.1)
|
||||
exit_mecha(mecha)
|
||||
return
|
||||
|
||||
//Smoke if there's too many targets - Smoke Power
|
||||
if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance))
|
||||
if(mecha.smoke_action && mecha.smoke_action.owner && mecha.smoke)
|
||||
mecha.smoke_action.Activate()
|
||||
//Smoke if there's too many targets - Smoke Power
|
||||
if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance))
|
||||
if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_smoke) && !mecha.smoke_charges)
|
||||
var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_smoke]
|
||||
action.Trigger()
|
||||
|
||||
//Heavy damage - Defence Power or Retreat
|
||||
if(mecha.obj_integrity < mecha.max_integrity*0.25)
|
||||
if(prob(defence_mode_chance))
|
||||
if(mecha.defense_action && mecha.defense_action.owner && !mecha.defence_mode)
|
||||
mecha.leg_overload_mode = 0
|
||||
mecha.defense_action.Activate(TRUE)
|
||||
addtimer(CALLBACK(mecha.defense_action, /datum/action/innate/mecha/mech_defence_mode.proc/Activate, FALSE), 100) //10 seconds of defence, then toggle off
|
||||
//Heavy damage - Defense Power or Retreat
|
||||
if(mecha.obj_integrity < mecha.max_integrity*0.25)
|
||||
if(prob(defense_mode_chance))
|
||||
if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode)
|
||||
var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode]
|
||||
action.Trigger(TRUE)
|
||||
addtimer(CALLBACK(action, /datum/action/vehicle/sealed/mecha/mech_defense_mode.proc/Trigger, FALSE), 100) //10 seconds of defense, then toggle off
|
||||
|
||||
else if(prob(retreat_chance))
|
||||
//Speed boost if possible
|
||||
if(mecha.overload_action && mecha.overload_action.owner && !mecha.leg_overload_mode)
|
||||
mecha.overload_action.Activate(TRUE)
|
||||
addtimer(CALLBACK(mecha.overload_action, /datum/action/innate/mecha/mech_defence_mode.proc/Activate, FALSE), 100) //10 seconds of speeeeed, then toggle off
|
||||
else if(prob(retreat_chance))
|
||||
//Speed boost if possible
|
||||
if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_overload_mode) && !mecha.leg_overload_mode)
|
||||
var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_overload_mode]
|
||||
mecha.leg_overload_mode = FALSE
|
||||
action.Trigger(TRUE)
|
||||
addtimer(CALLBACK(action, /datum/action/vehicle/sealed/mecha/mech_overload_mode.proc/Trigger, FALSE), 100) //10 seconds of speeeeed, then toggle off
|
||||
|
||||
retreat_distance = 50
|
||||
spawn(100)
|
||||
retreat_distance = 0
|
||||
retreat_distance = 50
|
||||
addtimer(VARSET_CALLBACK(src, retreat_distance, 0), 10 SECONDS)
|
||||
|
||||
|
||||
|
||||
@@ -261,17 +263,17 @@
|
||||
//~simple animals~
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target)
|
||||
if(ismecha(the_target))
|
||||
var/obj/mecha/M = the_target
|
||||
var/obj/vehicle/sealed/mecha/M = the_target
|
||||
if(mecha)
|
||||
if(M == mecha || !CanAttack(M.occupant))
|
||||
return 0
|
||||
if(M == mecha) //Dont kill yourself
|
||||
return FALSE
|
||||
else //we're not in a mecha, so we check if we can steal it instead.
|
||||
if(is_valid_mecha(M))
|
||||
return 1
|
||||
else if (M.occupant && CanAttack(M.occupant))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return TRUE
|
||||
for(var/occupant in M.occupants)
|
||||
if(CanAttack(occupant))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
. = ..()
|
||||
|
||||
@@ -290,6 +292,6 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance)
|
||||
if(mecha)
|
||||
walk_to(mecha, target, minimum_distance, mecha.step_in)
|
||||
walk_to(mecha, target, minimum_distance, mecha.movedelay)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -57,7 +57,7 @@ Difficulty: Medium
|
||||
/datum/action/innate/megafauna_attack/kinetic_accelerator,
|
||||
/datum/action/innate/megafauna_attack/transform_weapon)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize()
|
||||
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize(mapload)
|
||||
. = ..()
|
||||
internal = new/obj/item/gps/internal/miner(src)
|
||||
miner_saw = new(src)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user