Squashed armalis/vox commits and human icon update commits:

Armalis gear and mob icons, plus sonic cannon.
Added sonic cannon skeleton code.
Noise cannon fire sound, Vox shriek sound.
Added Vox Armalis species.
Swapped vox breath mask over to species_restricted check.
Added Vox Armalis gear.
Added a random shriek effect to Vox and Vox Armalis speech.
Added quickspawn Vox Armalis definition.
Vox shriek sound effect. Thought I committed this earlier.
Added r_hand and l_hand icon_overwrite checks.
More work on Armalis. Added gut() and leap() human procs.
Adding/fixing up the leap() and gut() verbs, and a LEAPING status_flag for human/Bump().
Fixing some missing pixels in the armalis tail.
Almost forgot to whitelist armalis...
This commit is contained in:
Zuhayr
2014-05-15 14:30:37 +09:30
parent cee5f92bcf
commit 429684d5ac
17 changed files with 259 additions and 27 deletions

View File

@@ -43,18 +43,11 @@
icon_state = "voxmask"
item_state = "voxmask"
permeability_coefficient = 0.01
species_restricted = ("Vox")
toggle()
set category = "Object"
set name = "Adjust mask"
set src in usr
usr << "You can't really adjust this mask - it's moulded to your beak!"
/obj/item/clothing/mask/breath/vox/mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/V = M
if(V.species.name != "Vox")
V << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0
return ..()
usr << "You can't really adjust this mask - it's moulded to your beak!"

View File

@@ -212,8 +212,8 @@
if (H.shoes != src)
user << "You will have to put on the [src] before you can do that."
return
flags |= NOSLIP
magpulse = 1
canremove = 0 //kinda hard to take off magclaws when you are gripping them tightly.
@@ -235,6 +235,35 @@
if (magpulse)
usr << "It would be hard to take these off without relaxing your grip first." //theoretically this message should only be seen by the wearer when the claws are equipped.
//Vox Armalis gear.
/obj/item/clothing/shoes/magboots/vox/armalis
name = "large vox magclaws"
item_state = "boots-armalis"
icon_state = "boots-armalis"
icon_override = 'icons/mob/vox.dmi'
species_restricted = list("Vox Armalis")
/obj/item/clothing/gloves/yellow/vox/armalis
name = "large insulated gauntlets"
item_state = "gloves-armalis"
icon_state = "gloves-armalis"
icon_override = 'icons/mob/vox.dmi'
species_restricted = list("Vox Armalis")
/obj/item/clothing/mask/breath/vox/armalis
name = "large vox mask"
item_state = "mask-armalis"
icon_state = "mask-armalis"
icon_override = 'icons/mob/vox.dmi'
species_restricted = list("Vox Armalis")
/obj/item/clothing/suit/space/vox/carapace/armalis
name = "large alien carapace armour"
item_state = "armour-armalis"
icon_state = "armour-armalis"
icon_override = 'icons/mob/vox.dmi'
species_restricted = list("Vox Armalis")
//Species-specific Syndicate rigs.
/obj/item/clothing/head/helmet/space/rig/syndi/tajara

View File

@@ -28,6 +28,10 @@
h_style = "Short Vox Quills"
..(new_loc, "Vox")
/mob/living/carbon/human/voxarmalis/New(var/new_loc)
h_style = "Bald"
..(new_loc, "Vox Armalis")
/mob/living/carbon/human/diona/New(var/new_loc)
..(new_loc, "Diona")
@@ -95,6 +99,13 @@
now_pushing = 0
return
//Leaping mobs just land on the tile, no pushing, no anything.
if(status_flags & LEAPING)
loc = tmob.loc
status_flags &= ~LEAPING
now_pushing = 0
return
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && canmove) // mutual brohugs all around!
var/turf/oldloc = loc
@@ -1308,4 +1319,106 @@
. = 0
if(!. && error_msg && user)
// Might need re-wording.
user << "<span class='alert'>There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into.</span>"
user << "<span class='alert'>There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into.</span>"
//Putting a couple of procs here that I don't know where else to dump.
//Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse).
/mob/living/carbon/human/proc/leap()
set category = "IC"
set name = "Leap"
set desc = "Leap at a target and grab them aggressively."
if(last_special > world.time)
return
if(stat)
src << "You cannot leap in your current state."
return
var/list/choices = list()
for(var/mob/living/M in view(6,src))
if(!istype(M,/mob/living/silicon))
choices += M
choices -= src
var/mob/living/T = input(src,"Who do you wish to leap at?") in null|choices
if(!T || !src || src.stat) return
if(get_dist(get_turf(T), get_turf(src)) > 6) return
last_special = world.time + 100
status_flags |= LEAPING
src.visible_message("<span class='warning'><b>\The [src]</b> leaps at [T]!</span>")
src.throw_at(get_step(get_turf(T),get_turf(src)), 5, 1)
playsound(src.loc, 'sound/voice/shriek1.ogg', 50, 1)
sleep(5)
if(status_flags & LEAPING) status_flags &= ~LEAPING
if(!src.Adjacent(T))
src << "\red You miss!"
return
T.Weaken(5)
var/use_hand = "left"
if(l_hand)
if(r_hand)
src << "\red You need to have one hand free to grab someone."
return
else
use_hand = "right"
src.visible_message("<span class='warning'><b>\The [src]</b> seizes [T] aggressively!</span>")
var/obj/item/weapon/grab/G = new(src,T)
if(use_hand == "left")
l_hand = G
else
r_hand = G
G.state = GRAB_AGGRESSIVE
G.icon_state = "grabbed1"
G.synch()
/mob/living/carbon/human/proc/gut()
set category = "IC"
set name = "Gut"
set desc = "While grabbing someone aggressively, rip their guts out or tear them apart."
if(last_special > world.time)
return
if(stat)
src << "\red You cannot do that in your current state."
return
var/obj/item/weapon/grab/G = locate() in src
if(!G || !istype(G))
src << "\red You are not grabbing anyone."
return
if(G.state < GRAB_AGGRESSIVE)
src << "\red You must have an aggressive grab to gut your prey!"
return
last_special = world.time + 50
visible_message("<span class='warning'><b>\The [src]</b> rips viciously at \the [G.affecting]'s body with its claws!</span>")
if(istype(G.affecting,/mob/living/carbon/human))
var/mob/living/carbon/human/H = G.affecting
H.apply_damage(50,BRUTE)
if(H.stat == 2)
H.gib()
else
var/mob/living/M = G.affecting
if(!istype(M)) return //wut
M.apply_damage(50,BRUTE)
if(M.stat == 2)
M.gib()

View File

@@ -8,8 +8,8 @@
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (Muted)."
return
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(stat == 2)
return say_dead(message)
@@ -22,10 +22,10 @@
if(name != GetVoice())
alt_name = "(as [get_id_name("Unknown")])"
var/message_mode = null
var/datum/language/speaking = null
if(copytext(message,1,2) == ";")
message_mode = "headset"
message = copytext(message,2)
@@ -44,10 +44,10 @@
if(speaking || copytext(message,1,2) == ":")
var/positioncut = 3
if(speaking && (message_mode && copytext(message,3,4)==":"))
if(speaking && (message_mode && copytext(message,3,4)==":"))
positioncut += 2
message = trim(copytext(message,positioncut))
message = capitalize(trim_left(message))
@@ -100,7 +100,7 @@
R = l_ear
has_radio = 1
if(l_hand && istype(l_hand,/obj/item/device/radio))
R = l_hand
R = l_hand
has_radio = 1
if(has_radio)
R.talk_into(src,message,null,verb,speaking)
@@ -131,7 +131,7 @@
used_radios += l_ear
else if(r_ear && istype(r_ear,/obj/item/device/radio))
r_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += r_ear
used_radios += r_ear
if(used_radios.len)
@@ -145,6 +145,9 @@
italics = 1
message_range =1
if((species.name == "Vox" || species.name == "Vox Armalis") && prob(20))
playsound(src.loc, 'sound/voice/shriek1.ogg', 50, 1)
..(message, speaking, verb, alt_name, italics, message_range, used_radios)
/mob/living/carbon/human/say_understands(var/mob/other,var/datum/language/speaking = null)
@@ -234,5 +237,5 @@
returns[1] = message
returns[2] = verb
returns[3] = handled
return returns

View File

@@ -717,7 +717,8 @@ proc/get_damage_icon_part(damage_state, body_part)
r_hand.screen_loc = ui_rhand //TODO
var/t_state = r_hand.item_state
if(!t_state) t_state = r_hand.icon_state
overlays_standing[R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = "[t_state]")
if(r_hand.icon_override) t_state = "[t_state]_r"
overlays_standing[R_HAND_LAYER] = image("icon" = ((r_hand.icon_override) ? r_hand.icon_override : 'icons/mob/items_righthand.dmi'), "icon_state" = "[t_state]")
if (handcuffed) drop_r_hand()
else
overlays_standing[R_HAND_LAYER] = null
@@ -729,7 +730,8 @@ proc/get_damage_icon_part(damage_state, body_part)
l_hand.screen_loc = ui_lhand //TODO
var/t_state = l_hand.item_state
if(!t_state) t_state = l_hand.icon_state
overlays_standing[L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = "[t_state]")
if(l_hand.icon_override) t_state = "[t_state]_l"
overlays_standing[L_HAND_LAYER] = image("icon" = ((l_hand.icon_override) ? l_hand.icon_override : 'icons/mob/items_lefthand.dmi'), "icon_state" = "[t_state]")
if (handcuffed) drop_l_hand()
else
overlays_standing[L_HAND_LAYER] = null
@@ -738,12 +740,12 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
overlays_standing[TAIL_LAYER] = null
if(species.tail && species.flags & HAS_TAIL)
if(species.tail && species.flags & HAS_TAIL)
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
overlays_standing[TAIL_LAYER] = image(tail_s)
overlays_standing[TAIL_LAYER] = image(tail_s)
if(update_icons)
update_icons()

View File

@@ -182,7 +182,44 @@
blood_color = "#2299FC"
flesh_color = "#808D11"
/datum/species/vox/armalis
name = "Vox Armalis"
icobase = 'icons/mob/human_races/r_armalis.dmi'
deform = 'icons/mob/human_races/r_armalis.dmi'
language = "Vox-pidgin"
warning_low_pressure = 50
hazard_low_pressure = 0
cold_level_1 = 80
cold_level_2 = 50
cold_level_3 = 0
heat_level_1 = 2000
heat_level_2 = 3000
heat_level_3 = 4000
brute_mod = 0.2
burn_mod = 0.2
eyes = "blank_eyes"
breath_type = "nitrogen"
flags = NO_SCAN | NO_BLOOD | HAS_TAIL | NO_PAIN | IS_WHITELISTED
blood_color = "#2299FC"
flesh_color = "#808D11"
tail = "armalis_tail"
/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H)
H.verbs += /mob/living/carbon/human/proc/gut
..()
/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H)
H.verbs += /mob/living/carbon/human/proc/leap
var/datum/organ/external/affected = H.get_organ("head")
//To avoid duplicates.

View File

@@ -12,7 +12,6 @@
item_state = "bolt"
//Launcher.
/obj/item/weapon/spikethrower
name = "Vox spike thrower"
@@ -112,4 +111,59 @@
spike.loc = get_turf(src)
spike.throw_at(target,10,fire_force)
spike = null
update_icon()
update_icon()
//This gun only functions for armalis. The on-sprite is too huge to render properly on other sprites.
/obj/item/weapon/gun/energy/noisecannon
name = "alien heavy cannon"
desc = "It's some kind of enormous alien weapon, as long as a man is tall."
icon = 'icons/obj/gun.dmi' //Actual on-sprite is handled by icon_override.
icon_override = 'icons/mob/vox.dmi'
icon_state = "noisecannon"
item_state = "noisecannon"
recoil = 1
force = 10
projectile_type = "/obj/item/projectile/energy/sonic"
cell_type = "/obj/item/weapon/cell/super"
fire_delay = 40
fire_sound = 'sound/effects/basscannon.ogg'
var/mode = 1
/obj/item/weapon/gun/energy/noisecannon/attack_hand(mob/user as mob)
if(loc != user)
var/mob/living/carbon/human/H = user
if(istype(H))
if(H.species.name == "Vox Armalis")
..()
return
user << "\red \The [src] is far too large for you to pick up."
return
/obj/item/weapon/gun/energy/noisecannon/load_into_chamber() //Does not have ammo.
in_chamber = new projectile_type(src)
return 1
/obj/item/weapon/gun/energy/noisecannon/update_icon()
return
//Projectile.
/obj/item/projectile/energy/sonic
name = "distortion"
icon = 'icons/obj/machines/particle_accelerator2.dmi'
icon_state = "particle"
damage = 60
damage_type = BRUTE
flag = "bullet"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
embed = 0
weaken = 5
stun = 5
/obj/item/projectile/energy/sonic/proc/split()
//TODO: create two more projectiles to either side of this one, fire at targets to the side of target turf.
return

View File

@@ -452,6 +452,7 @@ var/list/global_mutations = list() // list of hidden mutation things
#define CANWEAKEN 2
#define CANPARALYSE 4
#define CANPUSH 8
#define LEAPING 16
#define GODMODE 4096
#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 KiB

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

BIN
sound/voice/shriek1.ogg Normal file

Binary file not shown.