Skip to content

Commit

Permalink
Introducing: Werewolves
Browse files Browse the repository at this point in the history
My take on werewolves! Featuring a combination of goonstation and monkiestation's werewolf. Currently they have maul victim, pounce, and tainted bite (claw) and many of the passive effects of being a werewolf such as lupine regeneration and a weakness to silver! They also have night vision, thermal vision, a really bad speech impediment, and many more traits to make them a proper mass-murder antag. Still got some work to do on em, but im happy with how much progress has been made and will happily let yall have it.
  • Loading branch information
hyperjll committed Feb 24, 2025
1 parent 64ec14a commit e8499bb
Show file tree
Hide file tree
Showing 33 changed files with 938 additions and 2 deletions.
2 changes: 1 addition & 1 deletion code/__DEFINES/is_helpers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ 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))

#define iswerewolf(A) (is_species(A, /datum/species/werewolf))

//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 @@ -18,6 +18,7 @@
#define ROLE_WIZARD "Wizard"
#define ROLE_SPY "Spy"
#define ROLE_INITIAL_INFECTED "Initial Infected"
#define ROLE_WEREWOLF "Werewolf"

// Midround roles
#define ROLE_ABDUCTOR "Abductor"
Expand All @@ -41,13 +42,15 @@
#define ROLE_VOIDWALKER "Voidwalker"
#define ROLE_HERETIC_MIDROUND "Heretic Awakening"
#define ROLE_INFILTRATOR "Infiltrator"
#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_SPY_INFILTRATOR "Spy Infiltrator"
#define ROLE_WEREWOLF_INVADER "Werewolf Invader"

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

// Midround
ROLE_ABDUCTOR = 0,
Expand All @@ -167,13 +171,15 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_VOIDWALKER = 0,
ROLE_HERETIC_MIDROUND = 0,
ROLE_INFILTRATOR = 0,
ROLE_LYCANTHROPY_VICTIM = 7,

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

// I'm not too sure why these are here, but they're not moving.
ROLE_GLITCH = 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
migrate_antagonist(ROLE_TRAITOR, list(ROLE_SYNDICATE_INFILTRATOR, ROLE_SLEEPER_AGENT))
migrate_antagonist(ROLE_WIZARD, list(ROLE_WIZARD_MIDROUND))
migrate_antagonist(ROLE_SPY, list(ROLE_SPY_INFILTRATOR))
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
1 change: 1 addition & 0 deletions hypermods/_DEFINES/mobs.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#define SPECIES_WEREWOLF "werewolf"
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,31 @@
cost = 3
requirements = list(5,5,5,5,5,5,5,5,5,5)
repeatable = TRUE

//////////////////////////////////////////////
// //
// 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
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
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,48 @@
new_heretic.knowledge_points = min(new_heretic.knowledge_points, 5)

return TRUE

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

/datum/dynamic_ruleset/midround/from_living/werewolves
name = "Lycanthropy Victim"
midround_ruleset_style = MIDROUND_RULESET_STYLE_HEAVY
antag_datum = /datum/antagonist/werewolf
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.
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
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,46 @@
M.mind.special_role = ROLE_INITIAL_INFECTED
M.mind.restricted_roles = restricted_roles
GLOB.pre_setup_antags += M.mind
return TRUE
return TRUE

//////////////////////////////////////////////
// //
// 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 = 8
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
Loading

0 comments on commit e8499bb

Please sign in to comment.