Merge pull request #18534 from Core0verload/ash_fix

Fixes unkillable ash drake (+ more runtime fixes)
This commit is contained in:
oranges
2016-06-15 10:44:20 +12:00
committed by GitHub
11 changed files with 86 additions and 65 deletions
@@ -90,12 +90,12 @@ Bonus
if(prob(15))
M.reagents.add_reagent("morphine",rand(5,7))
if(4)
M.reagents.add_reagent_list(list("ethanol",rand(7,15),"mindbreaker",rand(5,10)))
M.reagents.add_reagent_list(list("ethanol" = rand(7,15), "mindbreaker" = rand(5,10)))
M << "<span class='warning'>u can count 2 potato!</span>"
if(prob(20))
M.reagents.add_reagent("morphine",rand(5,7))
if(5)
M.reagents.add_reagent_list(list("impedrezene",rand(5,15),"ethanol",rand(7,20),"mindbreaker",rand(5,15)))
M.reagents.add_reagent_list(list("impedrezene" = rand(5,15), "ethanol" = rand(7,20), "mindbreaker" = rand(5,15)))
if(prob(25))
M.reagents.add_reagent("morphine",rand(5,7))
return
-7
View File
@@ -110,13 +110,6 @@
var/phase_state = "" //icon_state when phasing
var/strafe = FALSE //If we are strafing
var/static/list/armour_facings = list(
"[NORTH]" = list("[SOUTH]" = FRONT_ARMOUR, "[EAST]" = SIDE_ARMOUR, "[WEST]" = SIDE_ARMOUR, "[NORTH]" = BACK_ARMOUR, "[SOUTHEAST]" = SIDE_ARMOUR, "[NORTHEAST]" = SIDE_ARMOUR, "[SOUTHWEST]" = SIDE_ARMOUR, "[NORTHWEST]" = SIDE_ARMOUR),
"[EAST]" = list("[SOUTH]" = SIDE_ARMOUR, "[WEST]" = FRONT_ARMOUR, "[EAST]" = BACK_ARMOUR, "[NORTH]" = SIDE_ARMOUR, "[SOUTHEAST]" = SIDE_ARMOUR, "[NORTHEAST]" = SIDE_ARMOUR, "[SOUTHWEST]" = SIDE_ARMOUR, "[NORTHWEST]" = SIDE_ARMOUR),
"[SOUTH]" = list("[NORTH]" = FRONT_ARMOUR, "[WEST]" = SIDE_ARMOUR, "[EAST]" = SIDE_ARMOUR, "[SOUTH]" = BACK_ARMOUR, "[SOUTHEAST]" = SIDE_ARMOUR, "[NORTHEAST]" = SIDE_ARMOUR, "[SOUTHWEST]" = SIDE_ARMOUR, "[NORTHWEST]" = SIDE_ARMOUR ),
"[WEST]" = list("[NORTH]" = SIDE_ARMOUR, "[EAST]" = FRONT_ARMOUR, "[SOUTH]" = SIDE_ARMOUR, "[WEST]" = BACK_ARMOUR, "[SOUTHEAST]" = SIDE_ARMOUR, "[NORTHEAST]" = SIDE_ARMOUR, "[SOUTHWEST]" = SIDE_ARMOUR, "[NORTHWEST]" = SIDE_ARMOUR)
)
var/occupant_sight_flags = 0 //sight flags to give to the occupant (e.g. mech mining scanner gives meson-like vision)
hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD)
+32 -21
View File
@@ -1,25 +1,37 @@
/obj/mecha/proc/get_armour_facing(srcdir,adir)
var/facing_hit = armour_facings["[srcdir]"]["[adir]"]
var/damage_modifier = facing_modifiers[facing_hit]
return damage_modifier || 1 //always return non-0
/obj/mecha/proc/get_armour_facing(relative_dir)
switch(relative_dir)
if(0) // BACKSTAB!
return facing_modifiers[BACK_ARMOUR]
if(45, 90, 270, 315)
return facing_modifiers[SIDE_ARMOUR]
if(225, 180, 135)
return facing_modifiers[FRONT_ARMOUR]
return 1 //always return non-0
/obj/mecha/proc/take_damage(amount, type="brute", adir = 0, booster_deflection_modifier = 1, booster_damage_modifier = 1)
var/facing_modifier = 1
if(adir)
facing_modifier = get_armour_facing(dir,adir)
if(prob(deflect_chance * booster_deflection_modifier * facing_modifier))
/obj/mecha/proc/take_damage(amount, type="brute", booster_deflection_modifier = 1, booster_damage_modifier = 1)
if(prob(deflect_chance * booster_deflection_modifier))
visible_message("<span class='danger'>[src]'s armour deflects the attack!</span>")
log_append_to_last("Armor saved.")
return
return 0
if(amount)
var/damage = absorbDamage(amount,type)
damage = (damage/facing_modifier) * booster_damage_modifier
damage = damage * booster_damage_modifier
health -= damage
update_health()
occupant_message("<span class='userdanger'>Taking damage!</span>")
log_append_to_last("Took [damage] points of damage. Damage type: \"[type]\".",1)
return 1
/obj/mecha/proc/take_directional_damage(amount, type="brute", adir = 0, booster_deflection_modifier = 1, booster_damage_modifier = 1)
var/facing_modifier = get_armour_facing(dir2angle(adir) - dir2angle(src))
booster_damage_modifier /= facing_modifier
booster_deflection_modifier *= facing_modifier
return take_damage(amount, type, booster_deflection_modifier, booster_damage_modifier)
/obj/mecha/proc/absorbDamage(damage,damage_type)
var/coeff = 1
@@ -36,7 +48,7 @@
/obj/mecha/attack_hulk(mob/living/carbon/human/user)
..(user, 1)
take_damage(15, "brute", user.dir)
take_directional_damage(15, "brute", get_dir(src, user))
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
user.visible_message("<span class='danger'>[user] hits [name]. The metal creaks and bends.</span>")
@@ -56,7 +68,7 @@
log_message("Attack by alien. Attacker - [user].",1)
user.changeNext_move(CLICK_CD_MELEE) //Now stompy alien killer mechs are actually scary to aliens!
user.do_attack_animation(src)
take_damage(15, "brute", user.dir)
take_directional_damage(15, "brute", get_dir(src, user))
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
playsound(loc, 'sound/weapons/slash.ogg', 50, 1, -1)
visible_message("<span class='danger'>The [user] slashes at [name]'s armor!</span>")
@@ -69,7 +81,7 @@
else
user.do_attack_animation(src)
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
take_damage(damage, "brute", user.dir)
take_directional_damage(damage, "brute", get_dir(src, user))
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
visible_message("<span class='danger'>[user] [user.attacktext] [src]!</span>")
add_logs(user, src, "attacked")
@@ -100,7 +112,7 @@
var/obj/O = A
if(O.throwforce)
visible_message("<span class='danger'>[name] is hit by [A].</span>")
take_damage(O.throwforce, "brute", 0, deflection, dam_coeff)
take_directional_damage(O.throwforce, "brute", get_dir(src, A), deflection, dam_coeff)
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return
@@ -116,8 +128,8 @@
break
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
take_damage(Proj.damage*dam_coeff,Proj.flag, Proj.dir, deflection, dam_coeff)
visible_message("<span class='danger'>[name] is hit by [Proj].</span>")
take_directional_damage(Proj.damage*dam_coeff,Proj.flag, turn(Proj.dir, 180), deflection, dam_coeff)
check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT))
Proj.on_hit(src)
@@ -144,8 +156,7 @@
return
/obj/mecha/blob_act(obj/effect/blob/B)
take_damage(30, "brute")
return
take_directional_damage(30, "brute", get_dir(src, B))
/obj/mecha/emp_act(severity)
if(get_charge())
@@ -296,7 +307,7 @@
log_append_to_last("Armor saved.")
else
user.visible_message("<span class='danger'>[user] hits [src] with [I].</span>", "<span class='danger'>You hit [src] with [I].</span>")
take_damage(round(I.force*dam_coeff),I.damtype)
take_directional_damage(round(I.force*dam_coeff),I.damtype, get_dir(src, user))
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
@@ -320,6 +331,6 @@
else
return
visible_message("<span class='danger'>[M.name] has hit [src].</span>")
take_damage(M.force, damtype, M.dir)
take_directional_damage(M.force, damtype, get_dir(src, M))
add_logs(M.occupant, src, "attacked", M, "(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
return
+16 -8
View File
@@ -15,23 +15,31 @@
var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent
/obj/effect/portal/Bumped(mob/M as mob|obj)
src.teleport(M)
teleport(M)
/obj/effect/portal/New(loc, turf/target, creator, lifespan=300)
/obj/effect/portal/attack_hand(mob/user)
if(Adjacent(user))
teleport(user)
/obj/effect/portal/attackby(obj/item/weapon/W, mob/user, params)
if(user && Adjacent(user))
teleport(user)
/obj/effect/portal/New(loc, turf/target, creator=null, lifespan=300)
..()
portals += src
src.loc = loc
src.target = target
src.creator = creator
var/area/A = target.loc
if(A.noteleport) // No point in persisting if the target is unreachable.
var/area/A = get_area(target)
if(A && A.noteleport) // No point in persisting if the target is unreachable.
qdel(src)
return
for(var/mob/M in src.loc)
src.teleport(M)
if(lifespan > 0)
spawn(lifespan)
qdel(src)
return
/obj/effect/portal/Destroy()
portals -= src
@@ -304,6 +304,11 @@
return
if(cyborg && (cyborg.stat != DEAD) && on)
if(!cyborg.cell)
cyborg << "<span class='warning'>Self-repair module deactivated. Please, insert the power cell.</span>"
deactivate()
return
if(cyborg.cell.charge < powercost * 2)
cyborg << "<span class='warning'>Self-repair module deactivated. Please recharge.</span>"
deactivate()
+1 -1
View File
@@ -108,6 +108,6 @@
seed_count++
for(var/i=0,i<seed_count,i++)
var/obj/item/seeds/replicapod/harvestseeds = src.Copy()
harvestseeds.loc = user.loc
harvestseeds.forceMove(parent.loc)
parent.update_tray()
+1 -1
View File
@@ -858,7 +858,7 @@
if(istype(user, /mob/living/silicon)) //How does AI know what plant is?
return
if(harvest)
myseed.harvest()
myseed.harvest(user)
else if(dead)
dead = 0
user << "<span class='notice'>You remove the dead plant from [src].</span>"
+14 -13
View File
@@ -141,18 +141,19 @@
return TRUE
/datum/plant_gene/trait/proc/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
if(origin_tech) // This ugly code segment adds RnD tech levels to resulting plants.
if(G.origin_tech)
var/list/tech = params2list(G.origin_tech)
for(var/t in origin_tech)
if(t in tech)
tech[t] = max(tech[t], origin_tech[t])
else
tech[t] = origin_tech[t]
G.origin_tech = list2params(tech)
else
G.origin_tech = list2params(origin_tech)
return
if(!origin_tech) // This ugly code segment adds RnD tech levels to resulting plants.
return
if(G.origin_tech)
var/list/tech = params2list(G.origin_tech)
for(var/t in origin_tech)
if(t in tech)
tech[t] = max(text2num(tech[t]), origin_tech[t])
else
tech[t] = origin_tech[t]
G.origin_tech = list2params(tech)
else
G.origin_tech = list2params(origin_tech)
/datum/plant_gene/trait/proc/on_consume(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
return
@@ -171,7 +172,7 @@
// For code, see grown.dm
name = "Liquid Contents"
examine_line = "<span class='info'>It has a lot of liquid contents inside.</span>"
origin_tech = list("bio" = 5)
origin_tech = list("biotech" = 5)
/*/datum/plant_gene/trait/squash/on_slip(obj/item/weapon/reagent_containers/food/snacks/grown/G, mob/living/carbon/target)
G.squash(target)*/
+2 -2
View File
@@ -109,14 +109,14 @@
//Drops the item in our left hand
/mob/proc/drop_l_hand()
if(!loc.allow_drop())
if(!loc || !loc.allow_drop())
return
return unEquip(l_hand) //All needed checks are in unEquip
//Drops the item in our right hand
/mob/proc/drop_r_hand()
if(!loc.allow_drop())
if(!loc || !loc.allow_drop())
return
return unEquip(r_hand)
@@ -176,7 +176,7 @@
fire_rain()
icon_state = "dragon"
if(swoop_target)
if(swoop_target && !qdeleted(swoop_target))
tturf = get_turf(swoop_target)
else
tturf = get_turf(src)
@@ -185,18 +185,18 @@
animate(src, pixel_x = 0, pixel_z = 0, time = 10)
sleep(10)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
for(var/mob/living/L in range(1,tturf))
if(L == src)
continue
for(var/mob/living/L in orange(1, src))
if(L.stat)
visible_message("<span class='danger'>[src] slams down on [L], crushing them!</span>")
L.gib()
else
var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
L.adjustBruteLoss(75)
L.throw_at_fast(throwtarget)
visible_message("<span class='danger'>[L] is thrown clear of [src]!</span>")
for(var/mob/M in range(7,src))
if(L && !qdeleted(L)) // Some mobs are deleted on death
var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
L.throw_at_fast(throwtarget)
visible_message("<span class='danger'>[L] is thrown clear of [src]!</span>")
for(var/mob/M in range(7, src))
shake_camera(M, 15, 1)
stop_automated_movement = FALSE
@@ -98,8 +98,11 @@ Borg Hypospray
if(M.reagents)
var/trans = R.trans_to(M, amount_per_transfer_from_this)
user << "<span class='notice'>[trans] unit\s injected. [R.total_volume] unit\s remaining.</span>"
var/contained = english_list(R)
add_logs(user, M, "injected", src, "(CHEMICALS: [contained])")
var/list/injected = list()
for(var/datum/reagent/RG in R.reagent_list)
injected += RG.name
add_logs(user, M, "injected", src, "(CHEMICALS: [english_list(injected)])")
/obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user)
var/chosen_reagent = modes[input(user, "What reagent do you want to dispense?") as null|anything in reagent_ids]