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" icon_state = "voxmask"
item_state = "voxmask" item_state = "voxmask"
permeability_coefficient = 0.01 permeability_coefficient = 0.01
species_restricted = ("Vox")
toggle() toggle()
set category = "Object" set category = "Object"
set name = "Adjust mask" set name = "Adjust mask"
set src in usr set src in usr
usr << "You can't really adjust this mask - it's moulded to your beak!" 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 ..()

View File

@@ -212,8 +212,8 @@
if (H.shoes != src) if (H.shoes != src)
user << "You will have to put on the [src] before you can do that." user << "You will have to put on the [src] before you can do that."
return return
flags |= NOSLIP flags |= NOSLIP
magpulse = 1 magpulse = 1
canremove = 0 //kinda hard to take off magclaws when you are gripping them tightly. canremove = 0 //kinda hard to take off magclaws when you are gripping them tightly.
@@ -235,6 +235,35 @@
if (magpulse) 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. 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. //Species-specific Syndicate rigs.
/obj/item/clothing/head/helmet/space/rig/syndi/tajara /obj/item/clothing/head/helmet/space/rig/syndi/tajara

View File

@@ -28,6 +28,10 @@
h_style = "Short Vox Quills" h_style = "Short Vox Quills"
..(new_loc, "Vox") ..(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) /mob/living/carbon/human/diona/New(var/new_loc)
..(new_loc, "Diona") ..(new_loc, "Diona")
@@ -95,6 +99,13 @@
now_pushing = 0 now_pushing = 0
return 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 //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! if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && canmove) // mutual brohugs all around!
var/turf/oldloc = loc var/turf/oldloc = loc
@@ -1308,4 +1319,106 @@
. = 0 . = 0
if(!. && error_msg && user) if(!. && error_msg && user)
// Might need re-wording. // 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) if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (Muted)." src << "\red You cannot speak in IC (Muted)."
return return
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(stat == 2) if(stat == 2)
return say_dead(message) return say_dead(message)
@@ -22,10 +22,10 @@
if(name != GetVoice()) if(name != GetVoice())
alt_name = "(as [get_id_name("Unknown")])" alt_name = "(as [get_id_name("Unknown")])"
var/message_mode = null var/message_mode = null
var/datum/language/speaking = null var/datum/language/speaking = null
if(copytext(message,1,2) == ";") if(copytext(message,1,2) == ";")
message_mode = "headset" message_mode = "headset"
message = copytext(message,2) message = copytext(message,2)
@@ -44,10 +44,10 @@
if(speaking || copytext(message,1,2) == ":") if(speaking || copytext(message,1,2) == ":")
var/positioncut = 3 var/positioncut = 3
if(speaking && (message_mode && copytext(message,3,4)==":")) if(speaking && (message_mode && copytext(message,3,4)==":"))
positioncut += 2 positioncut += 2
message = trim(copytext(message,positioncut)) message = trim(copytext(message,positioncut))
message = capitalize(trim_left(message)) message = capitalize(trim_left(message))
@@ -100,7 +100,7 @@
R = l_ear R = l_ear
has_radio = 1 has_radio = 1
if(l_hand && istype(l_hand,/obj/item/device/radio)) if(l_hand && istype(l_hand,/obj/item/device/radio))
R = l_hand R = l_hand
has_radio = 1 has_radio = 1
if(has_radio) if(has_radio)
R.talk_into(src,message,null,verb,speaking) R.talk_into(src,message,null,verb,speaking)
@@ -131,7 +131,7 @@
used_radios += l_ear used_radios += l_ear
else if(r_ear && istype(r_ear,/obj/item/device/radio)) else if(r_ear && istype(r_ear,/obj/item/device/radio))
r_ear.talk_into(src,message, message_mode, verb, speaking) r_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += r_ear used_radios += r_ear
if(used_radios.len) if(used_radios.len)
@@ -145,6 +145,9 @@
italics = 1 italics = 1
message_range =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) ..(message, speaking, verb, alt_name, italics, message_range, used_radios)
/mob/living/carbon/human/say_understands(var/mob/other,var/datum/language/speaking = null) /mob/living/carbon/human/say_understands(var/mob/other,var/datum/language/speaking = null)
@@ -234,5 +237,5 @@
returns[1] = message returns[1] = message
returns[2] = verb returns[2] = verb
returns[3] = handled returns[3] = handled
return returns return returns

View File

@@ -717,7 +717,8 @@ proc/get_damage_icon_part(damage_state, body_part)
r_hand.screen_loc = ui_rhand //TODO r_hand.screen_loc = ui_rhand //TODO
var/t_state = r_hand.item_state var/t_state = r_hand.item_state
if(!t_state) t_state = r_hand.icon_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() if (handcuffed) drop_r_hand()
else else
overlays_standing[R_HAND_LAYER] = null 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 l_hand.screen_loc = ui_lhand //TODO
var/t_state = l_hand.item_state var/t_state = l_hand.item_state
if(!t_state) t_state = l_hand.icon_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() if (handcuffed) drop_l_hand()
else else
overlays_standing[L_HAND_LAYER] = null 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) /mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
overlays_standing[TAIL_LAYER] = null 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)) 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") 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) 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) if(update_icons)
update_icons() update_icons()

View File

@@ -182,7 +182,44 @@
blood_color = "#2299FC" blood_color = "#2299FC"
flesh_color = "#808D11" 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) /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") var/datum/organ/external/affected = H.get_organ("head")
//To avoid duplicates. //To avoid duplicates.

View File

@@ -12,7 +12,6 @@
item_state = "bolt" item_state = "bolt"
//Launcher. //Launcher.
/obj/item/weapon/spikethrower /obj/item/weapon/spikethrower
name = "Vox spike thrower" name = "Vox spike thrower"
@@ -112,4 +111,59 @@
spike.loc = get_turf(src) spike.loc = get_turf(src)
spike.throw_at(target,10,fire_force) spike.throw_at(target,10,fire_force)
spike = null 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 CANWEAKEN 2
#define CANPARALYSE 4 #define CANPARALYSE 4
#define CANPUSH 8 #define CANPUSH 8
#define LEAPING 16
#define GODMODE 4096 #define GODMODE 4096
#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath #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 #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.