Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion code/__DEFINES/DNA.dm
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@
#define DNA_MUSHROOM_CAPS_BLOCK 14
#define DNA_POD_HAIR_BLOCK 15
#define DNA_FISH_TAIL_BLOCK 16
// Surf Shack Edit
#define DNA_WEREWOLF_TAIL_BLOCK 17
#define DNA_WEREWOLF_EARS_BLOCK 18
//surf shack end

// Hey! Listen up if you're here because you're adding a species feature!
//
Expand All @@ -70,7 +74,7 @@
// (Which means having a DNA block for a feature tied to a mob without DNA is entirely pointless.)

/// Total amount of DNA blocks, must be equal to the highest DNA block number
#define DNA_FEATURE_BLOCKS 16
#define DNA_FEATURE_BLOCKS 18 // Surf Shack edit +2

#define DNA_SEQUENCE_LENGTH 4
#define DNA_MUTATION_BLOCKS 8
Expand Down
4 changes: 3 additions & 1 deletion code/__DEFINES/is_helpers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,9 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(
#define ismonkey(A) (is_species(A, /datum/species/monkey))
#define isandroid(A) (is_species(A, /datum/species/android))
#define isnightmare(A) (is_species(A, /datum/species/shadow/nightmare))

// Surf Shack Edit
#define iswerewolf(A) (is_species(A, /datum/species/werewolf))
// Surf Shack End

//More carbon mobs
#define isalien(A) (istype(A, /mob/living/carbon/alien))
Expand Down
6 changes: 6 additions & 0 deletions code/__DEFINES/role_preferences.dm
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#define ROLE_TRAITOR "Traitor"
#define ROLE_WIZARD "Wizard"
#define ROLE_SPY "Spy"
#define ROLE_WEREWOLF "Werewolf"

// Midround roles
#define ROLE_ABDUCTOR "Abductor"
Expand All @@ -38,12 +39,14 @@
#define ROLE_SPIDER "Spider"
#define ROLE_WIZARD_MIDROUND "Wizard (Midround)"
#define ROLE_VOIDWALKER "Voidwalker"
#define ROLE_LYCANTHROPY_VICTIM "Lycanthropy Victim"

// Latejoin roles
#define ROLE_HERETIC_SMUGGLER "Heretic Smuggler"
#define ROLE_PROVOCATEUR "Provocateur"
#define ROLE_STOWAWAY_CHANGELING "Stowaway Changeling"
#define ROLE_SYNDICATE_INFILTRATOR "Syndicate Infiltrator"
#define ROLE_WEREWOLF_INVADER "Werewolf Invader"

// Other roles
#define ROLE_ANOMALY_GHOST "Ectoplasmic Anomaly Ghost"
Expand Down Expand Up @@ -146,6 +149,7 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_WIZARD = 14,
ROLE_SPY = 0,
ROLE_BLOODSUCKER = 0,
ROLE_WEREWOLF = 7,

// Midround
ROLE_ABDUCTOR = 0,
Expand All @@ -169,13 +173,15 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_VOIDWALKER = 0,
ROLE_BLOODSUCKERBREAKOUT = 0,
ROLE_SWARMER = 0,
ROLE_LYCANTHROPY_VICTIM = 7,

// Latejoin
ROLE_HERETIC_SMUGGLER = 0,
ROLE_PROVOCATEUR = 14,
ROLE_SYNDICATE_INFILTRATOR = 0,
ROLE_STOWAWAY_CHANGELING = 0,
ROLE_VAMPIRICACCIDENT = 0,
ROLE_WEREWOLF_INVADER = 7,

// I'm not too sure why these are here, but they're not moving.
ROLE_GLITCH = 0,
Expand Down
29 changes: 29 additions & 0 deletions code/controllers/subsystem/dynamic/dynamic_rulesets_latejoin.dm
Original file line number Diff line number Diff line change
Expand Up @@ -251,3 +251,32 @@
picked_mob.mind.special_role = antag_flag
picked_mob.mind.add_antag_datum(antag_datum)
return TRUE

// Surf Shack Edits below
//////////////////////////////////////////////
// //
// WEREWOLF INVADERS //
// //
//////////////////////////////////////////////

/datum/dynamic_ruleset/latejoin/werewolves
name = "Werewolf Invader"
antag_flag = ROLE_WEREWOLF_INVADER
antag_flag_override = ROLE_WEREWOLF
antag_datum = /datum/antagonist/werewolf/invader
protected_roles = list(
JOB_CAPTAIN,
JOB_DETECTIVE,
JOB_HEAD_OF_SECURITY,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
restricted_roles = list(
JOB_AI,
JOB_CYBORG,
)
required_candidates = 1
weight = 1
cost = 10
requirements = list(50,45,40,30,15,10,10,10,10,10)
repeatable = TRUE
47 changes: 47 additions & 0 deletions code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm
Original file line number Diff line number Diff line change
Expand Up @@ -999,3 +999,50 @@
message_admins("[ADMIN_LOOKUPFLW(voidwalker)] has been made into a Voidwalker by the midround ruleset.")
log_dynamic("[key_name(voidwalker)] was spawned as a Voidwalker by the midround ruleset.")
return voidwalker

// Surf Shack Edits below

//////////////////////////////////////////////
// //
// WEREWOLVES (Midround) //
// //
//////////////////////////////////////////////

/datum/dynamic_ruleset/midround/from_living/werewolves
name = "Lycanthropy Victim"
midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY
antag_datum = /datum/antagonist/werewolf/lycanthropy
antag_flag = ROLE_LYCANTHROPY_VICTIM
antag_flag_override = ROLE_WEREWOLF
minimum_required_age = 0
protected_roles = list(
JOB_CAPTAIN,
JOB_DETECTIVE,
JOB_HEAD_OF_SECURITY,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
restricted_roles = list(
JOB_AI,
JOB_CYBORG,
ROLE_POSITRONIC_BRAIN,
)
required_candidates = 1
weight = 0 // Currently only comes from lycanthropy. Should NEVER roll naturally.
cost = 10
scaling_cost = 10
requirements = list(50,45,40,30,15,10,10,10,10,10)
antag_cap = list("denominator" = 38)
repeatable = TRUE

/datum/dynamic_ruleset/midround/from_living/werewolves/pre_execute(population)
. = ..()
for (var/i in 1 to get_antag_cap_scaling_included(population))
if(candidates.len <= 0)
break
var/mob/M = pick_n_take(candidates)
assigned += M.mind
M.mind.special_role = ROLE_LYCANTHROPY_VICTIM
M.mind.restricted_roles = restricted_roles
GLOB.pre_setup_antags += M.mind
return TRUE
44 changes: 44 additions & 0 deletions code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm
Original file line number Diff line number Diff line change
Expand Up @@ -738,3 +738,47 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE)
// Scaling adds a fraction of the amount of additional spies rather than the full amount.
/datum/dynamic_ruleset/roundstart/spies/get_scaling_antag_cap(population)
return ceil(..() * fraction_per_scale)

// Surf Shack Edits below

//////////////////////////////////////////////
// //
// WEREWOLVES //
// //
//////////////////////////////////////////////

/datum/dynamic_ruleset/roundstart/werewolves
name = "Werewolf"
antag_flag = ROLE_WEREWOLF
antag_datum = /datum/antagonist/werewolf
minimum_required_age = 0
protected_roles = list(
JOB_CAPTAIN,
JOB_DETECTIVE,
JOB_HEAD_OF_SECURITY,
JOB_SECURITY_OFFICER,
JOB_WARDEN,
)
restricted_roles = list(
JOB_AI,
JOB_CYBORG,
)
required_candidates = 1
weight = 3
cost = 10
scaling_cost = 10
minimum_players = 20
requirements = list(50,45,40,30,15,10,10,10,10,10)
antag_cap = list("denominator" = 38)

/datum/dynamic_ruleset/roundstart/werewolves/pre_execute(population)
. = ..()
for (var/i in 1 to get_antag_cap_scaling_included(population))
if(candidates.len <= 0)
break
var/mob/M = pick_n_take(candidates)
assigned += M.mind
M.mind.special_role = ROLE_WEREWOLF
M.mind.restricted_roles = restricted_roles
GLOB.pre_setup_antags += M.mind
return TRUE
6 changes: 6 additions & 0 deletions code/controllers/subsystem/sprite_accessories.dm
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
var/list/tails_list_lizard
var/list/tails_list_monkey
var/list/tails_list_fish
//Surf Shack Edit
var/list/tails_list_werewolf
//Surf Shack End
var/list/ears_list
var/list/wings_list
var/list/wings_open_list
Expand Down Expand Up @@ -93,6 +96,9 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
tails_list_monkey = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey)[DEFAULT_SPRITE_LIST]
//tails fo fish organ infusions, not for prefs.
tails_list_fish = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/fish)[DEFAULT_SPRITE_LIST]
//Surf Shack Edit
tails_list_werewolf = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/werewolf)[DEFAULT_SPRITE_LIST]
//Surf Shack End
snouts_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts)[DEFAULT_SPRITE_LIST]
horns_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
ears_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
Expand Down
24 changes: 24 additions & 0 deletions code/datums/ai/telegraph_effects.dm
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,27 @@
icon = 'icons/mob/telegraphing/telegraph.dmi'
icon_state = "target_circle"
duration = 2 SECONDS

// Surf Shack Edit
/obj/effect/temp_visual/telegraphing/exclamation
icon = 'icons/mob/telegraphing/telegraph.dmi'
icon_state = "exclamation"
duration = 1 SECONDS

/obj/effect/temp_visual/telegraphing/exclamation/Initialize(mapload, duration)
if(!isnull(duration))
src.duration = duration
return ..()

/obj/effect/temp_visual/telegraphing/exclamation/following/Initialize(mapload, duration, obj/following)
. = ..()
if(isnull(following))
return INITIALIZE_HINT_QDEL
glide_size = following.glide_size
RegisterSignal(following, COMSIG_MOVABLE_MOVED, PROC_REF(follow))

///called when the thing we're following moves
/obj/effect/temp_visual/telegraphing/exclamation/following/proc/follow(datum/source)
SIGNAL_HANDLER
forceMove(get_turf(source))
// Surf Shack End
8 changes: 8 additions & 0 deletions code/datums/dna.dm
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
L[DNA_POD_HAIR_BLOCK] = construct_block(SSaccessories.pod_hair_list.Find(features["pod_hair"]), length(SSaccessories.pod_hair_list))
if(features["fish_tail"])
L[DNA_FISH_TAIL_BLOCK] = construct_block(SSaccessories.tails_list_fish.Find(features["fish_tail"]), length(SSaccessories.tails_list_fish))
//Surf Shack Edit
if(features["werewolf_tail"])
L[DNA_WEREWOLF_TAIL_BLOCK] = construct_block(SSaccessories.tails_list_werewolf.Find(features["werewolf_tail"]), length(SSaccessories.tails_list_werewolf))
//Surf Shack End

for(var/blocknum in 1 to DNA_FEATURE_BLOCKS)
. += L[blocknum] || random_string(GET_UI_BLOCK_LEN(blocknum), GLOB.hex_characters)
Expand Down Expand Up @@ -426,6 +430,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
set_uni_feature_block(blocknumber, construct_block(SSaccessories.pod_hair_list.Find(features["pod_hair"]), length(SSaccessories.pod_hair_list)))
if(DNA_FISH_TAIL_BLOCK)
set_uni_feature_block(blocknumber, construct_block(SSaccessories.tails_list_fish.Find(features["fish_tail"]), length(SSaccessories.tails_list_fish)))
//Surf Shack Edit
if(DNA_WEREWOLF_TAIL_BLOCK)
set_uni_feature_block(blocknumber, construct_block(SSaccessories.tails_list_werewolf.Find(features["werewolf_tail"]), length(SSaccessories.tails_list_werewolf)))
//Surf Shack End

//Please use add_mutation or activate_mutation instead
/datum/dna/proc/force_give(datum/mutation/human/human_mutation)
Expand Down
17 changes: 16 additions & 1 deletion code/datums/sprite_accessories.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1810,7 +1810,15 @@
icon = 'icons/mob/human/species/monkey/monkey_tail.dmi'
icon_state = "default"
color_src = FALSE
//Surf Shack Start
/datum/sprite_accessory/tails/werewolf
name = "Werewolf"
icon = 'icons/mob/human/species/werewolf_features.dmi'
color_src = HAIR_COLOR

/datum/sprite_accessory/tails/werewolf/default
icon_state = "default"
//Surf Shack End
/datum/sprite_accessory/pod_hair
icon = 'icons/mob/human/species/podperson_hair.dmi'
em_block = TRUE
Expand Down Expand Up @@ -1934,7 +1942,14 @@
icon_state = "fox"
color_src = HAIR_COLOR
locked = TRUE

//Surf Shack Start
/datum/sprite_accessory/ears/werewolf
icon = 'icons/mob/human/species/werewolf_features.dmi'
name = "Werewolf"
icon_state = "werewolf"
color_src = HAIR_COLOR
locked = TRUE
//Surf Shack End
/datum/sprite_accessory/wings
icon = 'icons/mob/human/species/wings.dmi'
em_block = TRUE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
migrate_antagonist(ROLE_REV_HEAD, list(ROLE_PROVOCATEUR))
migrate_antagonist(ROLE_TRAITOR, list(ROLE_SYNDICATE_INFILTRATOR, ROLE_SLEEPER_AGENT))
migrate_antagonist(ROLE_WIZARD, list(ROLE_WIZARD_MIDROUND))
migrate_antagonist(ROLE_WEREWOLF, list(ROLE_LYCANTHROPY_VICTIM, ROLE_WEREWOLF_INVADER))


// If you have an antagonist enabled, it will add the alternative preferences for said antag in be_special.
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added icons/mob/human/species/werewolf_features.dmi
Binary file not shown.
Binary file modified icons/mob/telegraphing/telegraph.dmi
Binary file not shown.
1 change: 1 addition & 0 deletions surfshack13/code/__DEFINES/mobs.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#define SPECIES_WEREWOLF "werewolf"
2 changes: 1 addition & 1 deletion surfshack13/code/__HELPERS/roundend.dm
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
return

queue[ckey] += list(list(round_end_bonus, "Played a Round"))
if(details?.mob?.mind?.assigned_role?.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND|DEPARTMENT_BITFLAG_SECURITY|DEPARTMENT_BITFLAG_SILICON)
if(details?.mob?.mind?.assigned_role?.departments_bitflags & (DEPARTMENT_BITFLAG_COMMAND|DEPARTMENT_BITFLAG_SECURITY|DEPARTMENT_BITFLAG_SILICON))
queue[ckey] += list(list(25, "Desired Role Bonus"))

if(details?.mob?.mind?.antag_datums != null)
Expand Down
Loading
Loading