카르스트
인간형
플레이어가 무조건 명중
stance movement speed +% final [-67]
1초마다 생명력의 2% 재생
Karst
SpectreN
Tagshuman, humanoid, is_unarmed, medium_movement, metal_armour, no_pantheon_mod, physical_affinity, red_blood, slashing_weapon
생명력
400%
Energy Shield From Life
33%
방어도
+33%
회피
+33%
Ailment Threshold
400%
저항
40 40 40 25
Damage
400%
정확도
100%
치명타 확률
+5%
치명타 피해 배율
+130%
Attack Distance
4 ~ 11
Attack Time
1.755 Second
Damage Spread
±20%
경험치
200%
Model Size
100%
Type
HeistAlliedNPC
Metadata
HeistLockPick1
레벨
68
생명력
17,241
방어도
38,291
회피
6,303
에너지 보호막
8,088
Damage
1,494
주문 피해
1,494
정확도
580
Attack Time
1.755
경험치
20,510
Minion Life
3,740
Minion Energy Shield
1,754
Minion Damage
1,193
Ailment Threshold
25,733
Chill
81
Shock
81
Brittle
460
Scorch
81
Sap
225
MPWHeistLockpickerDaggerToss
Attack, RangedAttack, MirageArcherCanUse, Projectile, ProjectilesFromUser, Damage, Triggerable
Base Damage: 1195–1793
치명타 확률: 5%
Attack Time: 1.755 초
주는 피해 278.7% 증폭
base is projectile [1]
maintain projectile direction when using contact position [1]
monster projectile variation [114]
projectile uses contact position [1]
use scaled contact offset [1]
MPWHeistLockpickerDaggerTossFan
Attack, RangedAttack, MirageArcherCanUse, Projectile, ProjectilesFromUser, Damage, Triggerable
Base Damage: 1195–1793
치명타 확률: 5%
Attack Time: 1.755 초
재사용 대기시간: 4 초
주는 피해 278.7% 증폭
투사체 6개 추가 발사
base is projectile [1]
maintain projectile direction when using contact position [1]
monster projectile variation [114]
projectile uses contact position [1]
use scaled contact offset [1]
HeistLockPick
[UNUSED] You son of a ****
[UNUSED I'm in
skill cannot be knocked back [1]
skill cannot be stunned [1]
HeistLockPickGround
[UNUSED] You son of a ****
[UNUSED I'm in
skill cannot be knocked back [1]
skill cannot be stunned [1]
EGHeistScoutDetect
Triggerable, Spell
시전 속도: 1.5 초
skill cannot be knocked back [1]
skill cannot be stunned [1]
EGHeistPerceptionDiscoverHidden
Triggerable, Spell
시전 속도: 1 초
재사용 대기시간: 1.5 초
skill cannot be stunned [1]
HeistFindDoorArt2
[UNUSED] You son of a ****
[UNUSED I'm in
skill cannot be knocked back [1]
skill cannot be stunned [1]
EASHeistAgilityClimbUp
Spell
시전 속도: 2.17 초
skill cannot be knocked back [1]
skill cannot be stunned [1]
EASHeistAgilityClimbDown
Spell
시전 속도: 1.67 초
skill cannot be knocked back [1]
skill cannot be stunned [1]
EASHeistAgilityAssassinateGuard
Attack
Base Damage: 1195–1793
치명타 확률: 5%
Attack Time: 1.755 초
재사용 대기시간: 2 초
main hand base maximum attack distance [-7]
skill cannot be knocked back [1]
skill cannot be stunned [1]
EGHeistAgilityPullLever
Triggerable, Spell
시전 속도: 3.33 초
spell maximum action distance +% [-95]
EASHeistAgilityClimbInFloor
Spell
시전 속도: 2.17 초
skill cannot be knocked back [1]
skill cannot be stunned [1]
EASHeistAgilityClimbOutFloor
Spell
시전 속도: 2.57 초
skill cannot be knocked back [1]
skill cannot be stunned [1]
EASTullinaFlippyFlip
Spell
시전 속도: 4.53 초
재사용 대기시간: 1 초
skill cannot be knocked back [1]
skill cannot be stunned [1]

Object Type

version 2
extends "Metadata/Monsters/LeagueHeist/NPCAllies/NPCAlliesBase"

Actor
{
    on_event_hidden_for_EmptyActionSpell5 = "SetAnimatedTurnDuration( 0 );"
	on_event_unhidden_for_EmptyActionSpell4 = "ResetAnimatedTurnDuration();"
}

SectorEvents
{
	
}

StateMachine
{
	on_state_abandoned_1 = "ResetAnimatedTurnDuration();"
}

Object Type Codes

version 2
extends "Metadata/Monsters/LeagueHeist/NPCAllies/NPCAlliesBase"

Actor
{
	on_event_hidden_for_EmptyActionSpell5 =
	"
		DisableRendering();
		HideMinimapIcon();
	"

	on_event_unhidden_for_EmptyActionSpell4 =
	"
		EnableRendering();
		ShowMinimapIcon();
		AddEffectPack( Metadata/Effects/Spells/NPC/League/Heist/Tullina/invisible/invisible.epk );
	"

	on_end_or_destroy_HeistLockPick =
	"
		DetachAllOfType( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/reveal.ao );
		DetachAllOfType( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/revealR.ao );
		DetachAllOfType( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/revealL.ao );
	"
}

Animated
{
	on_reveal_start_01 =
	"
		AddAttached( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/revealR.ao, jazz_hand_R );
		AddAttached( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/revealL.ao, jazz_hand_L );
	"

	on_reveal_01 =
	"
		PlayAnimationAttached( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/revealR.ao, loop );
		PlayAnimationAttached( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/revealL.ao, loop );
	"

	on_reveal_end_01 =
	"
		PlayAnimationAttached( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/revealR.ao, end );
		PlayAnimationAttached( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/revealL.ao, end );
		DetachAllOfType( Metadata/Effects/Spells/monsters_effects/League_Heist/Nenet/reveal.ao );
	"

	on_end_open_lever_01 = "RemoveEffectPack( Metadata/Effects/Spells/NPC/League/Heist/Tullina/invisible/invisible.epk );"
}

StateMachine
{
	on_state_abandoned_1 =
	"
		EnableRendering();
		ShowMinimapIcon();
		RemoveEffectPack( Metadata/Effects/Spells/NPC/League/Heist/Tullina/invisible/invisible.epk, true );
	"
}
-- src\Data\Spectres.lua
minions["Metadata/Monsters/LeagueHeist/NPCAllies/HeistLockPick1"] = {
    name = "Karst",
    life = 4,
    energyShield = 0.33,
    fireResist = 40,
    coldResist = 40,
    lightningResist = 40,
    chaosResist = 25,
    damage = 4,
    damageSpread = 0.2,
    attackTime = 1.755,
    attackRange = 11,
    accuracy = 1,
    skillList = {
        "MPWHeistLockpickerDaggerToss",
        "MPWHeistLockpickerDaggerTossFan",
        "EASHeistAgilityClimbUp",
        "EASHeistAgilityClimbInFloor",
        "EASHeistAgilityClimbDown",
        "EASHeistAgilityClimbOutFloor",
        "EASHeistAgilityAssassinateGuard",
        "EGHeistAgilityPullLever",
        "HeistLockPick",
        "HeistLockPickGround",
        "HeistFindDoorArt2",
        "EGHeistScoutDetect",
        "EASTullinaFlippyFlip",
        "EGHeistPerceptionDiscoverHidden",
    },
    modList = {
    },
}
-- src\Data\Skills\spectre.lua
skills["MPWHeistLockpickerDaggerToss"] = {
    name = "MPWHeistLockpickerDaggerToss",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.RangedAttack] = true,
        [SkillType.MirageArcherCanUse] = true,
        [SkillType.Projectile] = true,
        [SkillType.ProjectilesFromUser] = true,
        [SkillType.Damage] = true,
        [SkillType.Triggerable] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1.333,
    baseFlags = {
        attack = true,
        projectile = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "active_skill_damage_+%_final",
        "monster_projectile_variation",
        "base_is_projectile",
        "use_scaled_contact_offset",
        "projectile_uses_contact_position",
        "maintain_projectile_direction_when_using_contact_position",
    },
    levels = {
        [1] = {-80, 114, levelRequirement = 1, statInterpolation = {2},  cost = { }, },
        [2] = {450, 114, levelRequirement = 100, statInterpolation = {2},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["MPWHeistLockpickerDaggerTossFan"] = {
    name = "MPWHeistLockpickerDaggerTossFan",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Attack] = true,
        [SkillType.RangedAttack] = true,
        [SkillType.MirageArcherCanUse] = true,
        [SkillType.Projectile] = true,
        [SkillType.ProjectilesFromUser] = true,
        [SkillType.Damage] = true,
        [SkillType.Triggerable] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1.333,
    baseFlags = {
        attack = true,
        projectile = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "active_skill_damage_+%_final",
        "monster_projectile_variation",
        "number_of_additional_projectiles",
        "base_is_projectile",
        "use_scaled_contact_offset",
        "projectile_uses_contact_position",
        "maintain_projectile_direction_when_using_contact_position",
    },
    levels = {
        [1] = {-80, 114, 6, levelRequirement = 1, statInterpolation = {2},  cost = { }, },
        [2] = {450, 114, 6, levelRequirement = 100, statInterpolation = {2},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["EASHeistAgilityClimbUp"] = {
    name = "EASHeistAgilityClimbUp",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Spell] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 2.17,
    baseFlags = {
        spell = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["EASHeistAgilityClimbInFloor"] = {
    name = "EASHeistAgilityClimbInFloor",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Spell] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 2.17,
    baseFlags = {
        spell = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["EASHeistAgilityClimbDown"] = {
    name = "EASHeistAgilityClimbDown",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Spell] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1.67,
    baseFlags = {
        spell = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["EASHeistAgilityClimbOutFloor"] = {
    name = "EASHeistAgilityClimbOutFloor",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Spell] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 2.57,
    baseFlags = {
        spell = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["EASHeistAgilityAssassinateGuard"] = {
    name = "EASHeistAgilityAssassinateGuard",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Attack] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1.33,
    baseFlags = {
        attack = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "main_hand_base_maximum_attack_distance",
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {-7, levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["EGHeistAgilityPullLever"] = {
    name = "EGHeistAgilityPullLever",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Triggerable] = true,
        [SkillType.Spell] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 3.33,
    baseFlags = {
        spell = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "spell_maximum_action_distance_+%",
    },
    levels = {
        [1] = {-95, levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["HeistLockPick"] = {
    name = "[UNUSED] You son of a ****",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    description = "[UNUSED  I'm in",
    skillTypes = {
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["HeistLockPickGround"] = {
    name = "[UNUSED] You son of a ****",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    description = "[UNUSED  I'm in",
    skillTypes = {
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["HeistFindDoorArt2"] = {
    name = "[UNUSED] You son of a ****",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    description = "[UNUSED  I'm in",
    skillTypes = {
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["EGHeistScoutDetect"] = {
    name = "EGHeistScoutDetect",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Triggerable] = true,
        [SkillType.Spell] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1.5,
    baseFlags = {
        spell = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["EASTullinaFlippyFlip"] = {
    name = "EASTullinaFlippyFlip",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Spell] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 4.53,
    baseFlags = {
        spell = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
        "skill_cannot_be_knocked_back",
    },
    levels = {
        [1] = {levelRequirement = 0, statInterpolation = {},  cost = { }, },
    },
}
-- src\Data\Skills\spectre.lua
skills["EGHeistPerceptionDiscoverHidden"] = {
    name = "EGHeistPerceptionDiscoverHidden",
    hidden = true,
    color = "4",
    baseEffectiveness = 0,
    incrementalEffectiveness = 0,
    skillTypes = {
        [SkillType.Triggerable] = true,
        [SkillType.Spell] = true,
    },
    statDescriptionScope = "skill_stat_descriptions",
    castTime = 1,
    baseFlags = {
        spell = true,
    },
    baseMods = {
    },
    qualityStats = {
    },
    stats = {
        "skill_cannot_be_stunned",
    },
    levels = {
        [1] = {levelRequirement = 1, statInterpolation = {},  cost = { }, },
    },
}
플레이어가 무조건 명중
FamilyAlwaysHits
Domains몬스터 (3)
GenerationType고유 (3)
Req. level1
Stats
  • global always hit Min: 1 Max: 1 Global
  • Craft Tags공격
    FamilyNothing
    Domains몬스터 (3)
    GenerationType고유 (3)
    Req. level1
    FamilyNothing
    Domains몬스터 (3)
    GenerationType고유 (3)
    Req. level1
    stance movement speed +% final [-67]
    FamilyStance
    Domains몬스터 (3)
    GenerationType고유 (3)
    Req. level1
    Stats
  • stance movement speed +% final Min: -67 Max: -67 Global
  • Craft Tags속도
    1초마다 생명력의 2% 재생
    FamilyLifeRegenerationRatePercentage
    Domains몬스터 (3)
    GenerationType고유 (3)
    Req. level1
    Stats
  • life regeneration rate per minute % Min: 120 Max: 120 Global
  • Craft Tagsresource 생명력
    keyval
    Stats.item_drop_slots1
    Stats.energy_shield_recharge_rate_per_minute_%2000
    Stats.mana_regeneration_rate_per_minute_%100
    Stats.base_maximum_mana200
    Stats.maximum_physical_damage_reduction_%75
    Stats.max_viper_strike_orbs4
    Stats.base_maximum_all_resistances_%75
    Stats.max_fuse_arrow_orbs5
    Stats.max_fire_beam_stacks8
    Stats.max_charged_attack_stacks10
    Stats.base_critical_strike_multiplier130
    Stats.critical_ailment_dot_multiplier_+30
    Stats.max_endurance_charges3
    Stats.max_frenzy_charges3
    Stats.max_power_charges3
    Stats.base_attack_speed_+%_per_frenzy_charge4
    Stats.base_attack_speed_+%_per_frenzy_charge_if_not_player_minion11
    Stats.base_cast_speed_+%_per_frenzy_charge4
    Stats.base_cast_speed_+%_per_frenzy_charge_if_not_player_minion11
    Stats.movement_velocity_+%_per_frenzy_charge_if_not_player_minion5
    Stats.object_inherent_damage_+%_final_per_frenzy_charge4
    Stats.physical_damage_reduction_%_per_endurance_charge4
    Stats.physical_damage_reduction_%_per_endurance_charge_if_not_player_minion11
    Stats.resist_all_elements_%_per_endurance_charge4
    Stats.resist_all_elements_%_per_endurance_charge_if_not_player_minion11
    Stats.critical_strike_chance_+%_per_power_charge50
    Stats.critical_strike_chance_+%_per_power_charge_if_not_player_minion150
    Stats.maximum_block_%75
    Stats.base_maximum_spell_block_%75
    Stats.base_number_of_totems_allowed1
    Stats.base_number_of_traps_allowed3
    Stats.base_number_of_remote_mines_allowed5
    Stats.movement_velocity_cap128
    Stats.maximum_life_leech_rate_%_per_minute1200
    Stats.maximum_mana_leech_rate_%_per_minute1200
    Stats.maximum_energy_shield_leech_rate_%_per_minute600
    Stats.monster_ignite_damage_+%_final-72
    Stats.monster_bleeding_damage_+%_final-86
    Stats.monster_poison_damage_+%_final-50
    Stats.bleeding_moving_damage_%_of_base_override500
    Stats.max_azurite_debuff_stacks10
    Stats.impaled_debuff_base_duration_ms8000
    Stats.impaled_debuff_number_of_reflected_hits5
    Stats.ignore_skill_weapon_restrictions1
    Stats.base_total_number_of_sigils_allowed3
    Stats.maximum_life_leech_amount_per_leech_%_max_life10
    Stats.maximum_mana_leech_amount_per_leech_%_max_mana10
    Stats.maximum_energy_shield_leech_amount_per_leech_%_max_energy_shield10
    Stats.object_inherent_melee_hit_stun_duration_+%_final20
    Stats.scale_melee_range_to_actor_scale1
    Stats.use_melee_pattern_range1
    Stats.actor_scale_+%_limit100
    Stats.damage_taken_when_hit_+%_final_per_fortification-1
    Stats.base_max_fortification20
    Stats.soul_eater_maximum_stacks45
    Stats.immune_to_auras_from_other_entities1
    Stats.cannot_die1
    Stats.monster_no_additional_player_scaling1
    Stats.suppress_phasing_visual1
    Stats.phase_through_objects1
    ObjectMagicProperties.stat_description_listMetadata/StatDescriptions/monster_stat_descriptions.txt
    Positioned.blockingtrue
    Positioned.team0, 1
    Positioned.serialise_collidabletrue
    BaseEvents.server_onlytrue
    Actor.basic_actionMove, Flee, StrafeLeft, StrafeRight, Advance, DoNothing, MonsterPickup, MoveForced, MoveSpecial
    Actor.slow_animations_go_to_idletrue
    Actor.on_event_hidden_for_EmptyActionSpell5SetAnimatedTurnDuration( 0 );
    Actor.on_event_unhidden_for_EmptyActionSpell4ResetAnimatedTurnDuration();
    Monster.preload_skills_when_addedtrue
    MinimapIcon.iconNPC
    StateMachine.define_state =
    StateMachine.", , ,
    StateMachine.minion1;
    StateMachine.lock_pick_progress;
    StateMachine.damage_penalty;
    StateMachine.heist_npc1;
    StateMachine.define_shared_state =
    StateMachine.current_job_index-1;
    StateMachine.current_job_level-1;
    StateMachine.heist_alert;
    StateMachine.point_light1;
    StateMachine.abandoned0;
    StateMachine.on_state_abandoned_1ResetAnimatedTurnDuration();
    Edit

    Wikis Content is available under CC BY-NC-SA 3.0 unless otherwise noted.