diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 7afabaa849d..7c7ea673335 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -202,9 +202,10 @@ update_flag
return
/obj/machinery/portable_atmospherics/canister/bullet_act(var/obj/item/projectile/Proj)
- if(Proj.damage)
- src.health -= round(Proj.damage / 2)
- healthcheck()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ if(Proj.damage)
+ src.health -= round(Proj.damage / 2)
+ healthcheck()
..()
/obj/machinery/portable_atmospherics/canister/meteorhit(var/obj/O as obj)
@@ -252,7 +253,7 @@ update_flag
/obj/machinery/portable_atmospherics/canister/attack_paw(var/mob/user as mob)
return src.attack_hand(user)
-
+
/obj/machinery/portable_atmospherics/canister/attack_alien(mob/living/carbon/alien/humanoid/user)
return
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 668a875d9b6..9dab90e6ed3 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -63,10 +63,10 @@
/obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj)
if(prob(Proj.damage))
- set_broken()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ set_broken()
..()
-
/obj/machinery/computer/blob_act()
if (prob(75))
for(var/x in verbs)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 564e25f1aad..8213c2f8879 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -369,8 +369,11 @@ Status: []
"},
sleep(60)
attacked = 0
- src.health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
+
..()
+
if(prob(45) && Proj.damage > 0) src.spark_system.start()
if (src.health <= 0)
src.die() // the death process :(
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index fa7c83ff2b8..6bb718ea8eb 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -275,12 +275,13 @@
popping = 0
/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj)
- src.health -= Proj.damage
- ..()
- if(prob(45) && Proj.damage > 0) src.spark_system.start()
- del (Proj)
- if (src.health <= 0)
- src.die()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.health -= Proj.damage
+ ..()
+ if(prob(45) && Proj.damage > 0) src.spark_system.start()
+ del(Proj)
+ if (src.health <= 0)
+ src.die()
return
/obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 6a3f81c461c..d34d2bb0f2e 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -260,7 +260,7 @@
if(do_after(melee_cooldown))
melee_can_hit = 1
return
-
+
/obj/mecha/proc/mech_toxin_damage(mob/living/target)
playsound(src, 'sound/effects/spray2.ogg', 50, 1)
if(target.reagents)
@@ -554,8 +554,10 @@
return
if(istype(Proj, /obj/item/projectile/beam/pulse))
ignore_threshold = 1
- src.take_damage(Proj.damage,Proj.flag)
- src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.take_damage(Proj.damage,Proj.flag)
+ src.visible_message("[src.name] is hit by [Proj].")
+ src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
Proj.on_hit(src)
return
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 7a21d472b82..64c29246834 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -19,6 +19,43 @@
return
*/
+/obj/mecha/working/ripley/Destroy()
+ while(src.damage_absorption.["brute"] < 0.6)
+ new /obj/item/asteroid/goliath_hide(src.loc)
+ src.damage_absorption.["brute"] = src.damage_absorption.["brute"] + 0.1 //If a goliath-plated ripley gets killed, all the plates drop
+ for(var/atom/movable/A in src.cargo)
+ A.loc = loc
+ step_rand(A)
+ cargo.Cut()
+ ..()
+
+/obj/mecha/working/ripley/go_out()
+ ..()
+ if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-open")
+ else if (src.damage_absorption.["brute"] == 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full-open")
+
+/obj/mecha/working/ripley/moved_inside(var/mob/living/carbon/human/H as mob)
+ ..()
+ if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g")
+ else if (src.damage_absorption.["brute"] == 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full")
+
+/obj/mecha/working/ripley/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob)
+ ..()
+ if (src.damage_absorption.["brute"] < 0.6 && src.damage_absorption.["brute"] > 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g")
+ else if (src.damage_absorption.["brute"] == 0.3)
+ src.overlays = null
+ src.overlays += image("icon" = "mecha.dmi", "icon_state" = "ripley-g-full")
+
/obj/mecha/working/ripley/firefighter
desc = "Standart APLU chassis was refitted with additional thermal protection and cistern."
name = "APLU \"Firefighter\""
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 63f318ba89c..e206fc37408 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -155,13 +155,13 @@
qdel(src)
/obj/structure/closet/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
..()
- if(health <= 0)
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- del(src)
-
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
+ if(health <= 0)
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = src.loc
+ del(src)
return
/obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob)
@@ -273,7 +273,7 @@
else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(src == user.loc)
- user << "You can not [welded?"unweld":"weld"] the locker from inside."
+ user << "You can not [welded?"unweld":"weld"] the locker from inside."
return
if(!WT.remove_fuel(0,user))
user << "You need more welding fuel to complete this task."
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index e477868a72e..577e28c02f9 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -69,16 +69,16 @@
/obj/structure/displaycase/captains_laser
name = "captain's display case"
- desc = "A display case for the captain's antique laser gun. It taunts you to kick it."
+ desc = "A display case for the captain's antique laser gun. It taunts you to kick it."
/obj/structure/displaycase/captains_laser/New()
req_access = list(access_captain)
occupant = new /obj/item/weapon/gun/energy/laser/captain(src)
locked = 1
update_icon()
-
+
/obj/structure/proc/getPrint(mob/user as mob)
- return md5(user:dna:uni_identity)
+ return md5(user:dna:uni_identity)
/obj/structure/displaycase/examine()
..()
@@ -112,12 +112,12 @@
/obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
..()
src.healthcheck()
return
-
/obj/structure/displaycase/blob_act()
if (prob(75))
getFromPool(/obj/item/weapon/shard, loc)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index efda3d2e00e..b02fb0f0c86 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -128,16 +128,13 @@
return !density
/obj/structure/grille/bullet_act(var/obj/item/projectile/Proj)
-
- if(!Proj) return
-
- //Tasers and the like should not damage grilles.
- if(Proj.damage_type == STAMINA)
+ if(!Proj)
return
-
- src.health -= Proj.damage*0.2
- healthcheck()
- return 0
+ ..()
+ if((Proj.damage_type != STAMINA)) //Grilles can't be exhausted to death
+ src.health -= Proj.damage*0.3
+ healthcheck()
+ return
/obj/structure/grille/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(iswirecutter(W))
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 3b24d5cc057..e77672df358 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -58,11 +58,9 @@ var/global/wcColored
// var/icon/silicateIcon = null // the silicated icon
/obj/structure/window/bullet_act(var/obj/item/projectile/Proj)
- //Tasers and the like should not damage windows.
- if(Proj.damage_type == STAMINA)
- return
-
- health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
+ update_nearby_icons()
..()
if(health <= 0)
var/pdiff=performWallPressureCheck(src.loc)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 39505b7ee40..0c8f61569b4 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -179,7 +179,8 @@
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
var/reflectchance = 80 - round(P.damage/3)
if(prob(reflectchance))
- adjustBruteLoss(P.damage * 0.5)
+ if((P.damage_type == BRUTE || P.damage_type == BURN))
+ adjustBruteLoss(P.damage * 0.5)
visible_message("The [P.name] gets reflected by [src]'s shell!", \
"The [P.name] gets reflected by [src]'s shell!")
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 47300bcd973..1cc7a8fff7d 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -11,7 +11,7 @@
var/projectiletype
var/projectilesound
var/casingtype
- var/move_to_delay = 2 //delay for the automated movement.
+ var/move_to_delay = 3 //delay for the automated movement.
var/list/friends = list()
var/vision_range = 9 //How big of an area to search for targets in, a vision of 9 attempts to find targets as soon as they walk into screen view
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 6a22c22cb04..65ee9f5629b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -32,8 +32,8 @@
/mob/living/simple_animal/hostile/asteroid/bullet_act(var/obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills
if(!stat)
Aggro()
- if(P.damage < 30)
- P.damage = (P.damage / 2)
+ if(P.damage < 30 && P.damage_type != BRUTE)
+ P.damage = (P.damage / 3)
visible_message("The [P] has a reduced effect on [src]!")
..()
@@ -42,7 +42,7 @@
var/obj/item/T = AM
if(!stat)
Aggro()
- if(T.throwforce <= 15)
+ if(T.throwforce <= 20)
visible_message("The [T.name] [src.throw_message] [src.name]!")
return
..()
@@ -76,6 +76,7 @@
ranged_cooldown_cap = 4
aggro_vision_range = 9
idle_vision_range = 2
+ turns_per_move = 5
/obj/item/projectile/temp/basilisk
name = "freezing blast"
@@ -123,13 +124,13 @@
icon_aggro = "Goldgrub_alert"
icon_dead = "Goldgrub_dead"
icon_gib = "syndicate_gib"
- vision_range = 3
+ vision_range = 2
aggro_vision_range = 9
- idle_vision_range = 3
- move_to_delay = 3
+ idle_vision_range = 2
+ move_to_delay = 5
friendly = "harmlessly rolls into"
- maxHealth = 60
- health = 60
+ maxHealth = 45
+ health = 45
harm_intent_damage = 5
melee_damage_lower = 0
melee_damage_upper = 0
@@ -208,6 +209,10 @@
Reward()
..()
+/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(var/damage)
+ idle_vision_range = 9
+ ..()
+
/mob/living/simple_animal/hostile/asteroid/hivelord
name = "hivelord"
desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original."
@@ -293,7 +298,7 @@
icon_dead = "Hivelordbrood"
icon_gib = "syndicate_gib"
mouse_opacity = 2
- move_to_delay = 0
+ move_to_delay = 1
friendly = "buzzes near"
vision_range = 10
speed = 3
@@ -328,9 +333,10 @@
mouse_opacity = 2
move_to_delay = 40
ranged = 1
+ ranged_cooldown = 2 //By default, start the Goliath with his cooldown off so that people can run away quickly on first sight
ranged_cooldown_cap = 8
friendly = "wails at"
- vision_range = 5
+ vision_range = 4
speed = 3
maxHealth = 300
health = 300
@@ -341,18 +347,50 @@
throw_message = "does nothing to the rocky hide of the"
aggro_vision_range = 9
idle_vision_range = 5
+ anchored = 1 //Stays anchored until death as to be unpullable
+ var/pre_attack = 0
+
+/mob/living/simple_animal/hostile/asteroid/goliath/Life()
+ ..()
+ handle_preattack()
+
+/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
+ if(ranged_cooldown <= 2 && !pre_attack)
+ pre_attack++
+ if(!pre_attack || stat || stance == HOSTILE_STANCE_IDLE)
+ return
+ icon_state = "Goliath_preattack"
+
+/mob/living/simple_animal/hostile/asteroid/goliath/revive()
+ anchored = 1
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/goliath/Die()
+ anchored = 0
+ ..()
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
- visible_message("The [src.name] digs its tentacles under [target.name]!")
var/tturf = get_turf(target)
- new /obj/effect/goliath_tentacle/original(tturf)
- ranged_cooldown = ranged_cooldown_cap
+ if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
+ visible_message("The [src.name] digs its tentacles under [target.name]!")
+ new /obj/effect/goliath_tentacle/original(tturf)
+ ranged_cooldown = ranged_cooldown_cap
+ icon_state = icon_aggro
+ pre_attack = 0
return
/mob/living/simple_animal/hostile/asteroid/goliath/adjustBruteLoss(var/damage)
ranged_cooldown--
+ handle_preattack()
..()
+/mob/living/simple_animal/hostile/asteroid/goliath/Aggro()
+ vision_range = aggro_vision_range
+ handle_preattack()
+ if(icon_state != icon_aggro)
+ icon_state = icon_aggro
+ return
+
/obj/effect/goliath_tentacle/
name = "Goliath tentacle"
icon = 'icons/mob/animal.dmi'
@@ -369,6 +407,9 @@
/obj/effect/goliath_tentacle/original
/obj/effect/goliath_tentacle/original/New()
+ for(var/obj/effect/goliath_tentacle/original/O in loc)//No more GG NO RE from 2+ goliaths simultaneously tentacling you
+ if(O != src)
+ qdel(src)
var/list/directions = cardinal.Copy()
var/counter
for(counter = 1, counter <= 3, counter++)
@@ -378,6 +419,7 @@
new /obj/effect/goliath_tentacle(T)
..()
+
/obj/effect/goliath_tentacle/proc/Trip()
for(var/mob/living/M in src.loc)
M.Weaken(5)
@@ -400,6 +442,7 @@
desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
icon = 'icons/obj/items.dmi'
icon_state = "goliath_hide"
+ flags = NOBLUDGEON
w_class = 3
layer = 4
@@ -408,10 +451,31 @@
if(istype(target, /obj/item/clothing/suit/space/rig/mining) || istype(target, /obj/item/clothing/head/helmet/space/rig/mining))
var/obj/item/clothing/C = target
var/current_armor = C.armor
- if(current_armor.["melee"] < 90)
- current_armor.["melee"] = min(current_armor.["melee"] + 10, 90)
+ if(current_armor.["melee"] < 80)
+ current_armor.["melee"] = min(current_armor.["melee"] + 10, 80)
user << "You strengthen [target], improving its resistance against melee attacks."
del(src)
else
user << "You can't improve [C] any further."
- return
+ return
+ if(istype(target, /obj/mecha/working/ripley))
+ var/obj/mecha/D = target
+ var/list/damage_absorption = D.damage_absorption
+ if(damage_absorption.["brute"] > 0.3)
+ damage_absorption.["brute"] = max(damage_absorption.["brute"] - 0.1, 0.3)
+ user << "You strengthen [target], improving its resistance against melee attacks."
+ qdel(src)
+ if(D.icon_state == "ripley-open")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
+ D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
+ else
+ user << "You can't add armour onto the mech while someone is inside!"
+ if(damage_absorption.["brute"] == 0.3)
+ if(D.icon_state == "ripley-open")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
+ D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
+ else
+ user << "You can't add armour onto the mech while someone is inside!"
+ else
+ user << "You can't improve [D] any further."
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 3d43d4628fb..df1f903f21f 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -75,7 +75,8 @@
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj)
if(!Proj) return
if(prob(65))
- src.health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.health -= Proj.damage
else
visible_message("\red [src] blocks [Proj] with its shield!")
return 0
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 801ebbbe387..7becc36cfa2 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -56,7 +56,7 @@
var/friendly = "nuzzles" //If the mob does no damage with it's attack
var/environment_smash = 0 //Set to 1 to allow breaking of crates,lockers,racks,tables; 2 for walls; 3 for Rwalls
- var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
+ var/speed = 1 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
var/can_hide = 0
//Hot simple_animal baby making vars
@@ -251,8 +251,11 @@
adjustBruteLoss(damage)
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
- if(!Proj) return
- adjustBruteLoss(Proj.damage)
+ if(!Proj)
+ return
+ if((Proj.damage_type != STAMINA))
+ adjustBruteLoss(Proj.damage)
+ Proj.on_hit(src, 0)
return 0
/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob)
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index 8f1e3ff0990..f056d9068c4 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index c4050aed844..f3d08f645c3 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 1e6d7e6b731..3bac44a808a 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ