[Ready for Review] Unapologetic Vaurca Buffs III: Revenge of the Buffs (#4885)

Implements various changes at the behest of lore-dev BygoneHero, namely:

Vaurca can now wear specially modified softsuits.
Vaurca now have their own special rigsuit a la the breacher: the combat exoskeleton. It comes with various special modules, including a boring laser that allows them to dig below themselves rapidly, a vaurca variant of the combat injector which includes phoron and k'ois paste, and a neural lattice which reduces halloss by sharing it with everyone else wearing a neural lattice.
Vaurca also have received various other currently unavailable event items, including a variant of the tactical mask that filters out nitrogen and allows the Vaurca wearing it to eat, tachyon rifles and carbines which penetrate up to three layers of walls and possess other fringe benefits, the gauss rifle which is a semi-automatic variant of the crossbow with greater power and a 6 rod magazine, the energy zweihander, commando armor and scout armor.
Introduces a general climbing mechanic. Climbing can be initiated by clicking on a wall or an open turf, and it is a percentage chance that is modified by the amount of stable/large items beneath you, and decreased by the amount of unstable/small items. Vaurca are naturally proficient and always succeed at climbing.
Changes Vaurca to see in blue-green vision. Their vision is generally brighter and reddish colors are converted to a blue-green color.
Adds the Sedantis flag, an interhive flag that celebrates the universal longing for Sedantis and is a symbol of the Vaurca diaspora.
This commit is contained in:
LordFowl
2018-07-22 19:17:03 +03:00
committed by Erki
parent b8fd0de694
commit 76372c4b15
84 changed files with 1315 additions and 178 deletions
+7 -2
View File
@@ -12,7 +12,7 @@
/obj/effect/effect/water/proc/set_color() // Call it after you move reagents to it
icon += reagents.get_color()
/obj/effect/effect/water/proc/set_up(var/turf/target, var/step_count = 5, var/delay = 5)
/obj/effect/effect/water/proc/set_up(var/turf/target, var/step_count = 5, var/delay = 5, var/lifespan = 10)
if(!target)
return
for(var/i = 1 to step_count)
@@ -28,7 +28,7 @@
if(T == get_turf(target))
break
sleep(delay)
sleep(10)
sleep(lifespan)
qdel(src)
//Wets everything in the tile
@@ -75,3 +75,8 @@
name = "chemicals"
icon = 'icons/obj/chempuff.dmi'
icon_state = ""
//used by evil things
/obj/effect/effect/water/firewater
name = "napalm gel"
icon_state = "mustard"
@@ -6,66 +6,105 @@
anchored = 1
var/amount = 1
Initialize(mapload, amt = 1, nologs = 0)
. = ..()
if(!nologs && !mapload)
message_admins("Liquid fuel has spilled in [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>)")
log_game("Liquid fuel has spilled in [loc.loc.name] ([loc.x],[loc.y],[loc.z])")
src.amount = amt
/obj/effect/decal/cleanable/liquid_fuel/Initialize(mapload, amt = 1, nologs = 0)
. = ..()
if(!nologs && !mapload)
message_admins("Liquid fuel has spilled in [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>)")
log_game("Liquid fuel has spilled in [loc.loc.name] ([loc.x],[loc.y],[loc.z])")
src.amount = amt
var/has_spread = 0
//Be absorbed by any other liquid fuel in the tile.
for(var/obj/effect/decal/cleanable/liquid_fuel/other in loc)
if(other != src)
other.amount += src.amount
other.Spread()
has_spread = 1
break
if(!has_spread)
Spread()
else
qdel(src)
proc/Spread(exclude=list())
//Allows liquid fuels to sometimes flow into other tiles.
if(amount < 15) return //lets suppose welder fuel is fairly thick and sticky. For something like water, 5 or less would be more appropriate.
var/turf/simulated/S = loc
if(!istype(S)) return
for(var/d in cardinal)
var/turf/simulated/target = get_step(src,d)
var/turf/simulated/origin = get_turf(src)
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
var/obj/effect/decal/cleanable/liquid_fuel/other_fuel = locate() in target
if(other_fuel)
other_fuel.amount += amount*0.25
if(!(other_fuel in exclude))
exclude += src
other_fuel.Spread(exclude)
else
new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25,1)
amount *= 0.75
flamethrower_fuel
icon_state = "mustard"
anchored = 0
Initialize(mapload, amt = 1, d = 0)
set_dir(d) //Setting this direction means you won't get torched by your own flamethrower.
. = ..()
var/has_spread = 0
//Be absorbed by any other liquid fuel in the tile.
for(var/obj/effect/decal/cleanable/liquid_fuel/other in loc)
if(other != src)
other.amount += src.amount
other.Spread()
has_spread = 1
break
if(!has_spread)
Spread()
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
if(amount < 0.1) return
var/turf/simulated/S = loc
if(!istype(S)) return
else
qdel(src)
for(var/d in list(turn(dir,90),turn(dir,-90), dir))
var/turf/simulated/O = get_step(S,d)
if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
continue
if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
/obj/effect/decal/cleanable/liquid_fuel/proc/Spread(exclude=list())
//Allows liquid fuels to sometimes flow into other tiles.
if(amount < 15) return //lets suppose welder fuel is fairly thick and sticky. For something like water, 5 or less would be more appropriate.
var/turf/simulated/S = loc
if(!istype(S)) return
for(var/d in cardinal)
var/turf/simulated/target = get_step(src,d)
var/turf/simulated/origin = get_turf(src)
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
var/obj/effect/decal/cleanable/liquid_fuel/other_fuel = locate() in target
if(other_fuel)
other_fuel.amount += amount*0.25
if(!(other_fuel in exclude))
exclude += src
other_fuel.Spread(exclude)
else
new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25,1)
amount *= 0.75
amount *= 0.25
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel
icon_state = "mustard"
anchored = 0
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Initialize(mapload, amt = 1, d = 0)
set_dir(d) //Setting this direction means you won't get torched by your own flamethrower.
. = ..()
/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Spread()
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
if(amount < 0.1) return
var/turf/simulated/S = loc
if(!istype(S)) return
for(var/d in list(turn(dir,90),turn(dir,-90), dir))
var/turf/simulated/O = get_step(S,d)
if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
continue
if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
amount *= 0.25
/obj/effect/decal/cleanable/liquid_fuel/napalm
name = "napalm gel"
/obj/effect/decal/cleanable/liquid_fuel/napalm/Initialize(mapload, amt = 1, nologs = 0)
. = ..()
START_PROCESSING(SSprocessing, src)
/obj/effect/decal/cleanable/liquid_fuel/napalm/Destroy()
STOP_PROCESSING(SSprocessing, src)
return ..()
/obj/effect/decal/cleanable/liquid_fuel/napalm/Spread()
if(amount < 100)
return
var/turf/simulated/S = loc
if(!istype(S))
return
for(var/d in cardinal)
var/turf/simulated/target = get_step(src,d)
var/turf/simulated/origin = get_turf(src)
if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
var/obj/effect/decal/cleanable/liquid_fuel/napalm/other_fuel = locate() in target
if(other_fuel)
other_fuel.amount += amount*0.5
target.hotspot_expose(2000, 400)
else
new/obj/effect/decal/cleanable/liquid_fuel/napalm(target, amount*0.5,1)
target.hotspot_expose(2000, 400)
amount *= 0.5
origin.hotspot_expose(2000, 400) //immediately ignite. its napalm bitch
/obj/effect/decal/cleanable/liquid_fuel/napalm/process()
for(var/mob/living/L in get_turf(src))
var/sticky = min(rand(5,25), amount)
if(sticky > 1)
L.adjust_fire_stacks(sticky)
amount = max(1, amount - sticky)
@@ -66,3 +66,8 @@
/obj/effect/projectile/impact/emitter
icon_state = "impact_emitter"
light_color = LIGHT_COLOR_GREEN
/obj/effect/projectile/impact/tachyon
name = "xray impact"
icon_state = "impact_tachyon"
light_color = LIGHT_COLOR_RED
@@ -60,3 +60,7 @@
/obj/effect/projectile/muzzle/bullet
icon_state = "muzzle_bullet"
/obj/effect/projectile/muzzle/tachyon
icon_state = "muzzle_pulse"
light_color = LIGHT_COLOR_CYAN
@@ -77,3 +77,8 @@
/obj/effect/projectile/tracer/emitter
icon_state = "emitter"
light_color = LIGHT_COLOR_GREEN
/obj/effect/projectile/tracer/tachyon
name = "particle beam"
icon_state = "invisible"
light_color = LIGHT_COLOR_VIOLET
-2
View File
@@ -686,8 +686,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
if(!cannotzoom)
M.visible_message("[zoomdevicename ? "[M] looks up from the [src.name]" : "[M] lowers the [src.name]"].")
return
/obj/item/proc/pwr_drain()
return 0 // Process Kill
@@ -149,6 +149,15 @@
icon_state = initial(icon_state)
user << "<span class='notice'>\The [src] is de-energised.</span>"
/obj/item/weapon/melee/energy/glaive/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
user.setClickCooldown(16)
..()
/obj/item/weapon/melee/energy/glaive/pre_attack(var/mob/living/target, var/mob/living/user)
if(istype(target))
cleave(user, target)
..()
/*
* Energy Axe
*/
@@ -24,7 +24,7 @@
slot_flags = SLOT_BACK
max_w_class = 3
max_storage_space = 28
var/species_restricted = list("exclude","Vaurca Breeder")
var/species_restricted = list("exclude","Vaurca Breeder","Vaurca Warform")
/obj/item/weapon/storage/backpack/mob_can_equip(M as mob, slot)
+261 -4
View File
@@ -39,7 +39,10 @@
icon_state = "eknife1"
item_state = icon_state
damtype = "fire"
user.regenerate_icons()
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.update_inv_l_hand()
H.update_inv_r_hand()
user << "<span class='notice'>\The [src] is now energised.</span>"
/obj/item/weapon/melee/energy/vaurca/deactivate(mob/living/user)
@@ -47,7 +50,10 @@
icon_state = "eknife0"
item_state = icon_state
damtype = "brute"
user.regenerate_icons()
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.update_inv_l_hand()
H.update_inv_r_hand()
user << "<span class='notice'>\The [src] is de-energised.</span>"
/obj/item/vaurca/box
@@ -172,7 +178,8 @@
species_restricted = list("Vaurca")
light_overlay = "helmet_light"
light_overlay = "helmet_light_dual_green"
light_color = "#3e7c3e"
/obj/item/clothing/shoes/magboots/vox/vaurca
@@ -183,7 +190,257 @@
contained_sprite = 1
icon = 'icons/obj/vaurca_items.dmi'
species_restricted = list("Vaurca")
species_restricted = list("Vaurca","Vaurca Warform")
sprite_sheets = list(
"Vaurca Warform" = 'icons/mob/species/warriorform/shoes.dmi'
)
action_button_name = "Toggle the magclaws"
/obj/item/clothing/suit/space/void/scout
name = "scout armor"
contained_sprite = 1
icon = 'icons/obj/vaurca_items.dmi'
icon_state = "scout"
item_state = "scout"
desc = "Armor designed for K'laxan scouts, made of lightweight sturdy material that does not restrict movement."
slowdown = -1
species_restricted = list("Vaurca")
armor = list(melee = 50, bullet = 20, laser = 50, energy = 30, bomb = 45, bio = 100, rad = 10)
/obj/item/clothing/head/helmet/space/void/scout
name = "scout helmet"
desc = "A helmet designed for K'laxan scouts, made of lightweight sturdy material that does not restrict movement."
contained_sprite = 1
icon = 'icons/obj/vaurca_items.dmi'
icon_state = "helm_scout"
item_state = "helm_scout"
species_restricted = list("Vaurca")
armor = list(melee = 40, bullet = 20, laser = 40, energy = 30, bomb = 45, bio = 100, rad = 10)
light_overlay = "helmet_light_dual_green"
light_color = "#3e7c3e"
/obj/item/clothing/suit/space/void/commando
name = "commando armor"
contained_sprite = 1
icon = 'icons/obj/vaurca_items.dmi'
icon_state = "commando"
item_state = "commando"
desc = "A design perfected by the Zo'ra, this helmet is commonly used by frontline warriors of a hive. Ablative design deflects lasers away from the body while providing moderate physical protection."
species_restricted = list("Vaurca")
armor = list(melee = 40, bullet = 40, laser = 60, energy = 50, bomb = 45, bio = 100, rad = 10)
/obj/item/clothing/head/helmet/space/void/commando
name = "commando helmet"
desc = "A design perfected by the Zo'ra, this helmet is commonly used by frontline warriors of a hive. Ablative design deflects lasers away from the body while providing moderate physical protection."
contained_sprite = 1
icon = 'icons/obj/vaurca_items.dmi'
icon_state = "helm_commando"
item_state = "helm_commando"
species_restricted = list("Vaurca")
armor = list(melee = 30, bullet = 30, laser = 60, energy = 50, bomb = 45, bio = 100, rad = 10)
light_overlay = "helmet_light_dual_green"
light_color = "#3e7c3e"
/obj/item/clothing/mask/gas/vaurca
name = "tactical garment"
desc = "A tactical mandible garment with state of the art air filtration."
item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | FLEXIBLEMATERIAL | THICKMATERIAL
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
body_parts_covered = FACE|EYES
gas_filter_strength = 3
w_class = 2.0
filtered_gases = list("nitrogen", "sleeping_agent")
armor = list(melee = 25, bullet = 10, laser = 25, energy = 25, bomb = 0, bio = 50, rad = 15)
icon = 'icons/obj/vaurca_items.dmi'
icon_state = "m_metalg"
item_state = "m_metalg"
contained_sprite = 1
/obj/item/weapon/melee/energy/vaurca_zweihander
name = "thermal greatblade"
desc = "An infamous execution blade of the Zo'ra, due to its size, only the largest Za were able to carry it in active combat."
icon = 'icons/obj/vaurca_items.dmi'
icon_state = "greatblade0"
item_state = "greatblade0"
active_force = 30
armor_penetration = 30
active_throwforce = 20
active_w_class = 5
force = 10
throwforce = 10
throw_speed = 5
throw_range = 10
w_class = 4.0
flags = CONDUCT | NOBLOODY
attack_verb = list("stabbed", "chopped", "sliced", "cleaved", "slashed", "cut")
sharp = 1
edge = 1
contained_sprite = 1
base_reflectchance = 40
base_block_chance = 60
shield_power = 150
/obj/item/weapon/melee/energy/vaurca_zweihander/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
user.setClickCooldown(16)
..()
/obj/item/weapon/melee/energy/vaurca_zweihander/pre_attack(var/mob/living/target, var/mob/living/user)
if(istype(target))
cleave(user, target)
..()
/obj/item/weapon/melee/energy/vaurca_zweihander/activate(mob/living/user)
..()
icon_state = "greatblade1"
item_state = icon_state
damtype = "fire"
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.update_inv_l_hand()
H.update_inv_r_hand()
user << "<span class='notice'>\The [src] is now energised.</span>"
/obj/item/weapon/melee/energy/vaurca_zweihander/deactivate(mob/living/user)
..()
icon_state = "greatblade0"
item_state = icon_state
damtype = "brute"
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.update_inv_l_hand()
H.update_inv_r_hand()
user << "<span class='notice'>\The [src] is de-energised.</span>"
/obj/item/weapon/gun/launcher/crossbow/vaurca
name = "gauss rifle"
desc = "An unwieldy, heavy weapon that propels metal projectiles with magnetic coils that run its length."
contained_sprite = 1
icon = 'icons/obj/vaurca_items.dmi'
icon_state = "gaussrifle"
item_state = "gaussrifle"
fire_sound = 'sound/effects/Explosion2.ogg'
fire_sound_text = "a subdued boom"
fire_delay = 12
slot_flags = SLOT_BACK
needspin = TRUE
recoil = 6
release_speed = 15
var/list/belt = new/list()
var/belt_size = 12 //holds this + one in the chamber
recoil_wielded = 2
accuracy_wielded = -1
fire_delay_wielded = 1
//action button for wielding
action_button_name = "Wield rifle"
/obj/item/weapon/gun/launcher/crossbow/vaurca/can_wield()
return 1
/obj/item/weapon/gun/launcher/crossbow/vaurca/ui_action_click()
if(src in usr)
toggle_wield(usr)
/obj/item/weapon/gun/launcher/crossbow/vaurca/verb/wield_rifle()
set name = "Wield rifle"
set category = "Object"
set src in usr
toggle_wield(usr)
if(istype(usr,/mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
H.update_inv_l_hand()
H.update_inv_r_hand()
/obj/item/weapon/gun/launcher/crossbow/vaurca/update_icon()
if(wielded)
item_state = "gaussrifle-wielded"
else
item_state = "gaussrifle"
update_held_icon()
/obj/item/weapon/gun/launcher/crossbow/vaurca/consume_next_projectile(mob/user=null)
return bolt
/obj/item/weapon/gun/launcher/crossbow/vaurca/handle_post_fire(mob/user, atom/target)
bolt = null
tension = 1
..()
/obj/item/weapon/gun/launcher/crossbow/vaurca/attack_self(mob/living/user as mob)
pump(user)
/obj/item/weapon/gun/launcher/crossbow/vaurca/proc/pump(mob/M as mob)
playsound(M, 'sound/weapons/shotgunpump.ogg', 60, 1)
if(bolt)
if(tension < max_tension)
M << "<span class='warning'>You pump [src], charging the magnetic coils.</span>"
tension++
else
M << "<span class='notice'>\The [src]'s magnetic coils are at maximum charge.</span>"
return
var/obj/item/next
if(belt.len)
next = belt[1]
if(next)
belt -= next //Remove grenade from loaded list.
bolt = next
M << "<span class='warning'>You pump [src], loading \a [next] into the chamber.</span>"
else
M << "<span class='warning'>You pump [src], but the magazine is empty.</span>"
/obj/item/weapon/gun/launcher/crossbow/vaurca/proc/load(obj/item/W, mob/user)
if(belt.len >= belt_size)
user << "<span class='warning'>[src] is full.</span>"
return
user.remove_from_mob(W)
W.forceMove(src)
belt.Insert(1, W) //add to the head of the list, so that it is loaded on the next pump
user.visible_message("[user] inserts \a [W] into [src].", "<span class='notice'>You insert \a [W] into [src].</span>")
/obj/item/weapon/gun/launcher/crossbow/vaurca/proc/unload(mob/user)
if(belt.len)
var/obj/item/weapon/arrow/rod/R = belt[belt.len]
belt.len--
user.put_in_hands(R)
user.visible_message("[user] removes \a [R] from [src].", "<span class='notice'>You remove \a [R] from [src].</span>")
else
user << "<span class='warning'>[src] is empty.</span>"
/obj/item/weapon/gun/launcher/crossbow/vaurca/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/arrow))
load(I, user)
if(istype(I, /obj/item/stack/rods))
var/obj/item/stack/rods/R = I
if (R.use(1))
var/obj/item/weapon/arrow/rod/ROD = new /obj/item/weapon/arrow/rod(src)
load(ROD, user)
else
..()
/obj/item/weapon/gun/launcher/crossbow/vaurca/attack_hand(mob/user)
if(user.get_inactive_hand() == src)
unload(user)
else
..()
/obj/item/weapon/gun/launcher/crossbow/vaurca/superheat_rod(mob/user)
if(!user || !bolt) return
if(bolt.throwforce >= 25) return
if(!istype(bolt,/obj/item/weapon/arrow/rod)) return
bolt.throwforce = 25
bolt.icon_state = "metal-rod-superheated"
/obj/item/weapon/gun/launcher/crossbow/vaurca/update_icon()
return
+3 -1
View File
@@ -907,7 +907,9 @@
/obj/item/ammo_casing/c45/rubber = 0.5,
/obj/item/ammo_casing/c9mm/rubber = 0.5,
/obj/item/ammo_casing/c45/flash = 0.5,
/obj/item/ammo_casing/shotgun/beanbag = 0.5
/obj/item/ammo_casing/shotgun/beanbag = 0.5,
/obj/item/weapon/flag/america = 1,
/obj/item/weapon/flag/america/l = 1
)
//Sometimes the chef will have spare oil in storage.
+38
View File
@@ -416,6 +416,44 @@
/obj/item/weapon/flag/eridani/l
flag_size = 1
/obj/structure/sign/flag/vaurca
name = "Sedantis flag"
desc = "The emblem of Sedantis on a flag, emblematic of Vaurca longing."
icon_state = "sedantis"
/obj/structure/sign/flag/vaurca/left
icon_state = "sedantis_l"
/obj/structure/sign/flag/vaurca/right
icon_state = "sedantis_r"
/obj/item/weapon/flag/vaurca
name = "Sedantis flag"
desc = "The emblem of Sedantis on a flag, emblematic of Vaurca longing."
flag_path = "sedantis"
/obj/item/weapon/flag/vaurca/l
flag_size = 1
/obj/structure/sign/flag/america
name = "Old World flag"
desc = "The banner of an ancient nation, its glory old."
icon_state = "oldglory"
/obj/structure/sign/flag/america/left
icon_state = "oldglory_l"
/obj/structure/sign/flag/america/right
icon_state = "oldglory_r"
/obj/item/weapon/flag/america
name = "Old World flag"
desc = "The banner of an ancient nation, its glory old."
flag_path = "soldglory"
/obj/item/weapon/flag/america/l
flag_size = 1
/obj/item/weapon/flag
name = "boxed flag"
desc = "A flag neatly folded into a wooden container."