diff --git a/docs/design/.gdignore b/docs/design/.gdignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/design/.gdignore @@ -0,0 +1 @@ + diff --git a/docs/design/fish_catalog_proposal.csv b/docs/design/fish_catalog_proposal.csv new file mode 100644 index 0000000..b583915 --- /dev/null +++ b/docs/design/fish_catalog_proposal.csv @@ -0,0 +1,314 @@ +catalog_number,display_name,collection_group,water_type,spawn_area,day_rule,rain_rule,fog_rule,rarity,base_catch_weight,weight_min_lb,weight_max_lb,sell_value_min,sell_value_max,sell_value_curve,required_bait_tags,required_event_tags,forbidden_event_tags,logbook_fact,active_status +101,bowfin,Ancient freshwater fish,Fresh Water,pond,Night,Any,Required,Rare,0.28,1,20,13,30,0.85,,,,bowfin can gulp air at the surface when warm backwaters run low on oxygen. a long dorsal fin ripples as they stalk prey.,inactive +102,lake sturgeon,Ancient freshwater fish,Fresh Water,lake,Night,Any,Any,Epic,0.09,10,180,36,82,0.8,,,,lake sturgeon sweep the bottom with four sensitive barbels before extending a tube-like mouth to feed. they can live for decades.,inactive +103,longnose gar,Ancient freshwater fish,Fresh Water,river,Day,Any,Any,Rare,0.24,2,35,14,34,0.85,,,,longnose gar wait near the surface before snapping sideways at passing fish. their narrow jaws carry rows of fine needle-like teeth.,inactive +104,paddlefish,Ancient freshwater fish,Fresh Water,river,Day,Required,Any,Epic,0.1,10,120,34,76,0.82,,,,"paddlefish cruise open rivers with their mouths wide, filtering tiny plankton from the water. the broad snout senses faint electrical signals.",inactive +105,shovelnose sturgeon,Ancient freshwater fish,Fresh Water,river,Night,Any,Any,Rare,0.22,1,8,12,25,0.9,,,,shovelnose sturgeon hug flowing river bottoms and probe for insect larvae. a flattened snout helps them hold position in strong current.,inactive +106,spotted gar,Ancient freshwater fish,Fresh Water,pond,Day,Any,Required,Rare,0.2,1,15,13,29,0.88,,,,spotted gar linger among vegetation where their mottled bodies break up their outline. they rise to gulp air as well as breathing through gills.,inactive +107,West African lungfish,Ancient freshwater fish,Fresh Water,pond,Night,Required,Any,Rare,0.3,1,10,12,28,0.86,,,,"west african lungfish breathe air with paired lungs. when floodplains dry, they seal themselves in a mud cocoon until water returns.",inactive +201,atlantic mudskipper,Brackish oddities,Salt Water,ocean,Day,Required,Any,Uncommon,1,0.03,0.5,5,11,0.95,,,,atlantic mudskippers use sturdy fins to hop and crawl across exposed mud. moist skin and mouth linings let them breathe out of water.,inactive +202,largescale foureyes,Brackish oddities,Fresh Water | Salt Water,river,Day,Any,Any,Rare,0.32,0.05,1,10,23,0.95,,,,largescale foureyes cruise with each eye divided across the waterline. one half watches above while the other scans below.,inactive +301,red mullet,Coastal bottom fish,Salt Water,ocean,Day,Any,Any,Uncommon,0.9,0.1,3,5,11,0.92,,,,red mullet comb sandy bottoms with two chin barbels that taste hidden prey. their foraging leaves winding trails in the sediment.,inactive +401,European plaice,Coastal flatfish,Salt Water,ocean,Day,Any,Any,Common,1.8,0.2,10,4,10,0.9,,,,european plaice lie flat on the seafloor with both eyes on the same side. orange spots help distinguish them from neighboring flatfish.,inactive +402,summer flounder,Coastal flatfish,Salt Water,ocean,Day,Any,Any,Uncommon,0.9,0.3,15,6,16,0.88,,,,summer flounder bury themselves in sand with only their eyes exposed. a sudden burst carries them upward to seize passing prey.,inactive +403,winter flounder,Coastal flatfish,Salt Water,ocean,Day,Forbidden,Any,Common,1.8,0.2,8,4,9,0.9,,,,winter flounder favor cool bays and estuaries where they rest on muddy bottoms. their eyes sit on the right side of the body.,inactive +501,dugong,Coastal marine mammals,Salt Water,ocean,Day,Any,Forbidden,Legendary,0.011,500,1100,72,165,0.77,,,,"dugongs graze seagrass meadows with a downturned, bristled snout. they are the only fully marine members of the sirenian family.",inactive +502,harbor seal,Coastal marine mammals,Salt Water,ocean,Day,Any,Required,Legendary,0.018,120,370,60,140,0.79,,,,harbor seals rest on rocky shores and sandbars between hunting trips. sensitive whiskers can trace the water trails left by moving fish.,inactive +503,sea otter,Coastal marine mammals,Salt Water,ocean,Day,Any,Any,Legendary,0.02,30,100,55,125,0.84,,,,sea otters float on their backs while opening shellfish with stones. dense fur traps insulating air because they lack a thick blubber layer.,inactive +504,walrus,Coastal marine mammals,Salt Water,ocean,Day,Any,Required,Legendary,0.012,800,3700,74,170,0.76,,,,walruses sweep the seafloor for clams and other soft-bodied prey. long tusks help them haul onto ice and settle disputes.,inactive +505,West Indian manatee,Coastal marine mammals,Salt Water,ocean,Day,Any,Forbidden,Legendary,0.012,440,1300,70,160,0.77,,,,west indian manatees graze aquatic plants in warm coastal water and rivers. they surface regularly to breathe through nostrils atop the snout.,inactive +601,bay pipefish,Coastal oddities,Salt Water,ocean,Day,Any,Any,Uncommon,0.9,0.005,0.04,4,9,1,,,,"bay pipefish hide upright among seagrass, matching the blades with their slender bodies. males carry developing eggs in a brood pouch.",inactive +602,lined seahorse,Coastal oddities,Salt Water,ocean,Day,Forbidden,Any,Rare,0.28,0.005,0.05,9,20,1,,,,lined seahorses anchor to grass and coral with curling tails. the male broods eggs in a pouch and releases fully formed young.,inactive +603,monkfish,Coastal oddities,Salt Water,ocean,Night,Any,Required,Rare,0.25,2,55,14,35,0.84,,,,monkfish hide against the bottom and wave a fleshy lure above a cavernous mouth. a sudden gulp draws fish and crustaceans inward.,inactive +604,tripletail,Coastal oddities,Salt Water,ocean,Day,Any,Required,Rare,0.28,1,30,13,31,0.85,,,,"tripletail often drift sideways near floating debris, resembling a loose leaf. rounded rear fins create the three-tailed silhouette.",inactive +701,atlantic mackerel,Coastal pelagic fish,Salt Water,ocean,Any,Any,Any,Common,0.5,0.5,5,4,9,0.9,,,,atlantic mackerel travel in fast schools across the north atlantic and feed on plankton and small schooling fish.,active +702,bluefish,Coastal pelagic fish,Salt Water,ocean,Day,Any,Any,Uncommon,0.85,0.5,25,7,19,0.85,,,,bluefish race in coordinated schools while pursuing smaller fish. sharp teeth and powerful jaws make their feeding bursts especially fierce.,inactive +703,cero mackerel,Coastal pelagic fish,Salt Water,ocean,Any,Any,Any,Uncommon,0.35,1,15,7,15,0.9,,,,cero mackerel are streamlined coastal hunters. sharp teeth help them slash through schools of smaller fish.,active +704,chub mackerel,Coastal pelagic fish,Salt Water,ocean,Any,Any,Any,Common,0.5,0.5,4,4,9,0.9,,,,chub mackerel school near the surface and follow plankton blooms. their dark wavy bars help identify them at a glance.,active +705,crevalle jack,Coastal pelagic fish,Salt Water,ocean,Day,Required,Any,Uncommon,0.8,1,35,7,20,0.84,,,,"crevalle jacks patrol warm coasts in fast-moving schools. their deep bodies and forked tails deliver long, powerful runs.",inactive +706,king mackerel,Coastal pelagic fish,Salt Water,ocean,Any,Any,Any,Uncommon,0.3,3,40,10,24,0.9,,,,king mackerel are swift coastal predators. their pointed teeth and long body are built for sudden bursts of speed.,active +707,spanish mackerel,Coastal pelagic fish,Salt Water,ocean,Any,Any,Any,Uncommon,0.35,1,15,8,18,0.9,,,,spanish mackerel hunt in warm coastal waters and often travel in loose schools while chasing baitfish.,active +708,talang queenfish,Coastal pelagic fish,Salt Water,ocean,Day,Any,Any,Uncommon,0.8,0.5,20,7,18,0.86,,,,talang queenfish chase schooling prey near warm coasts and estuaries. hooked teeth and a deeply forked tail suit their rapid attacks.,inactive +801,American sand lance,Coastal schooling fish,Salt Water,ocean,Day,Any,Any,Common,3,0.02,0.4,1,3,1,,,,american sand lance dive headfirst into loose sand when danger approaches. immense schools carry energy from plankton to larger predators.,inactive +802,atlantic menhaden,Coastal schooling fish,Salt Water,ocean,Day,Any,Any,Common,3,0.1,1.5,2,5,0.98,,,,"atlantic menhaden strain plankton from coastal water with fine gill rakers. dense schools feed whales, seabirds, and predatory fish.",inactive +803,black pomfret,Coastal schooling fish,Salt Water,ocean,Any,Any,Any,Uncommon,0.3,1,15,8,18,0.9,,,,"black pomfret have a deep, laterally compressed body that lets them maneuver neatly through open water.",active +804,chinese pomfret,Coastal schooling fish,Salt Water,ocean,Any,Any,Any,Uncommon,0.3,1,20,9,20,0.9,,,,"chinese pomfret are silvery schooling fish with a tall, flattened body and long sickle-shaped fins.",active +805,european anchovy,Coastal schooling fish,Salt Water,ocean,Any,Any,Any,Common,0.5,0.05,0.25,2,4,0.9,,,,european anchovies form dense schools and feed by filtering tiny plankton from coastal water.,active +806,European pilchard,Coastal schooling fish,Salt Water,ocean,Any,Any,Any,Common,3.5,0.05,0.6,2,4,1,,,,european pilchards form shimmering schools along atlantic and mediterranean coasts. they feed mainly on plankton near the surface.,inactive +807,golden pomfret,Coastal schooling fish,Salt Water,ocean,Any,Any,Any,Rare,0.18,2,25,14,30,0.9,,,,golden pomfret are warm-water swimmers whose golden sheen is most noticeable along the fins and flanks.,active +808,northern anchovy,Coastal schooling fish,Salt Water,ocean,Any,Any,Any,Common,0.5,0.05,0.35,2,4,0.9,,,,northern anchovies gather in huge schools along the pacific coast and filter plankton with their fine gill rakers.,active +809,Pacific sardine,Coastal schooling fish,Salt Water,ocean,Any,Any,Any,Common,3.5,0.05,0.5,2,4,1,,,,"pacific sardines follow cool, productive water in enormous schools. their movements shift as currents and plankton supplies change.",inactive +810,white pomfret,Coastal schooling fish,Salt Water,ocean,Any,Any,Any,Common,0.45,0.5,10,5,12,0.9,,,,"white pomfret gather over coastal grounds and use their compact, deep bodies to turn quickly while feeding.",active +901,blacktip shark,Coastal sharks,Salt Water,ocean,Day,Required,Any,Epic,0.1,15,150,32,75,0.8,,,,blacktip sharks are named for the dark markings on their fins. they hunt schooling fish in warm shallows and sometimes leap clear of the water.,inactive +902,great hammerhead shark,Coastal sharks,Salt Water,ocean,Day,Any,Forbidden,Legendary,0.035,50,1000,62,145,0.78,,,,great hammerheads sweep their wide heads over the bottom while searching for rays. widely spaced senses help pinpoint hidden prey.,inactive +903,great white shark,Coastal sharks,Salt Water,ocean,Day,Any,Any,Legendary,0.025,100,1000,70,150,0.76,,,,great white sharks conserve heat in their swimming muscles while crossing cool seas. rows of serrated teeth are replaced throughout life.,inactive +904,tiger shark,Coastal sharks,Salt Water,ocean,Night,Required,Any,Epic,0.06,50,1000,50,120,0.8,,,,tiger sharks carry dark vertical bars that fade as they mature. broad jaws let them investigate an unusually varied range of prey.,inactive +905,whale shark,Coastal sharks,Salt Water,ocean,Day,Any,Forbidden,Legendary,0.025,500,45000,70,160,0.76,,,,whale sharks are enormous filter feeders covered in unique spot patterns. they cruise with open mouths to collect plankton and tiny fish.,inactive +1001,burbot,Cold freshwater fish,Fresh Water,lake,Night,Any,Required,Rare,0.24,0.5,18,12,28,0.86,,,,burbot are the only freshwater members of the cod family. they become most active in cold darkness and may spawn beneath winter ice.,inactive +1002,cisco,Cold freshwater fish,Fresh Water,lake,Day,Any,Any,Common,2.2,0.1,3,3,7,0.95,,,,cisco school in the cool open water of northern lakes. these slim relatives of salmon feed on plankton and become prey for larger fish.,inactive +1003,lake whitefish,Cold freshwater fish,Fresh Water,lake,Any,Any,Any,Common,1.5,0.5,12,4,11,0.9,,,,"lake whitefish browse deep, cold bottoms with small downward-pointing mouths. large schools move toward shallows to spawn in autumn.",inactive +1101,arctic char,Cold freshwater salmonids,Fresh Water | Salt Water,lake,Any,Forbidden,Any,Rare,0.3,1,25,14,32,0.86,,,,arctic char thrive farther north than any other freshwater fish. some remain in lakes while others migrate between rivers and the sea.,inactive +1102,arctic grayling,Cold freshwater salmonids,Fresh Water,river,Day,Any,Forbidden,Uncommon,0.75,0.3,6,6,14,0.9,,,,"arctic grayling carry a tall, colorful dorsal fin like a sail. they feed on drifting insects in cold, clear rivers and lakes.",inactive +1103,brown trout,Cold freshwater salmonids,Fresh Water,river,Night,Any,Any,Uncommon,0.8,0.5,25,7,20,0.86,,,,"brown trout often shelter by day and hunt more freely after dark. adaptable populations occupy streams, lakes, and even coastal water.",inactive +1104,cutthroat trout,Cold freshwater salmonids,Fresh Water,river,Any,Any,Any,Uncommon,0.4,0.25,10,5,12,0.9,,,,"cutthroat trout take their name from the red slash beneath the jaw. many populations rely on cold, well-oxygenated streams.",active +1105,golden trout,Cold freshwater salmonids,Fresh Water,lake,Any,Any,Any,Rare,0.2,0.2,3,8,16,0.9,,,,"golden trout evolved in clear, high-elevation california streams. their bright flanks stand out against rocky alpine water.",active +1106,rainbow trout,Cold freshwater salmonids,Fresh Water,river,Any,Any,Any,Uncommon,0.45,0.5,20,5,11,0.9,,,,rainbow trout are adaptable stream hunters. the pink lateral stripe is especially vivid when the fish is in breeding condition.,active +1201,atlantic wolffish,Cold reef fish,Salt Water,ocean,Any,Forbidden,Any,Rare,0.25,2,40,14,34,0.84,,,,atlantic wolffish use heavy jaws and blunt teeth to crush shellfish and urchins. natural antifreeze proteins help them endure icy water.,inactive +1202,cusk,Cold reef fish,Salt Water,ocean,Night,Any,Any,Uncommon,0.75,0.5,30,7,19,0.85,,,,"cusk move slowly across cold rocky bottoms, sheltering in cracks and caves. a single long fin runs around much of the rear body.",inactive +1203,spotted wolffish,Cold reef fish,Salt Water,ocean,Any,Any,Required,Epic,0.11,3,50,26,60,0.84,,,,spotted wolffish crush hard-shelled prey with broad molar-like teeth. their pale spots stand out against a dark cold-water body.,inactive +1301,atlantic herring,Cold schooling fish,Salt Water,ocean,Any,Any,Any,Common,3,0.1,1.5,2,5,0.98,,,,atlantic herring gather in immense schools that move between feeding and spawning grounds. they filter plankton with fine gill rakers.,inactive +1302,capelin,Cold schooling fish,Salt Water,ocean,Any,Any,Required,Uncommon,1,0.03,0.2,4,8,1,,,,"capelin are small polar fish that feed whales, seabirds, and larger fish. many schools roll onto beaches or shallows to release their eggs.",inactive +1303,European sprat,Cold schooling fish,Salt Water,ocean,Any,Any,Any,Common,3.2,0.03,0.3,1,3,1,,,,european sprat form compact schools in northern coastal seas. these tiny herring relatives feed on plankton near the surface.,inactive +1304,pacific herring,Cold schooling fish,Salt Water,ocean,Any,Required,Any,Common,2.8,0.1,1.5,2,5,0.98,,,,pacific herring return to coastal shallows to coat plants and rocks with eggs. their oily schools support entire marine food webs.,inactive +1401,Alaska pollock,Cold shelf fish,Salt Water,ocean,Any,Any,Any,Common,2.5,0.3,8,3,8,0.92,,,,alaska pollock form vast schools over cold northern shelves. they feed on plankton and fish while supporting many larger predators.,inactive +1402,atlantic cod,Cold shelf fish,Salt Water,ocean,Any,Any,Any,Common,1.8,1,55,5,18,0.85,,,,"atlantic cod carry a pale lateral line and one chin barbel. they search cold seafloors for crustaceans, mollusks, and smaller fish.",inactive +1403,Atlantic pollock,Cold shelf fish,Salt Water,ocean,Day,Any,Forbidden,Uncommon,0.9,1,35,7,18,0.86,,,,atlantic pollock are swift relatives of cod with dark backs and pale lateral lines. adults gather around rocky banks and wrecks.,inactive +1404,Dover sole,Cold shelf fish,Salt Water,ocean,Night,Any,Any,Uncommon,0.8,0.2,8,6,14,0.9,,,,dover sole glide over deep muddy bottoms of the eastern pacific. both eyes migrate to the right side as the young fish becomes flat.,inactive +1405,haddock,Cold shelf fish,Salt Water,ocean,Day,Any,Any,Common,2,0.5,20,4,11,0.9,,,,haddock are recognized by a dark shoulder mark and black lateral line. schools forage over cold seafloors for small bottom animals.,inactive +1406,pacific cod,Cold shelf fish,Salt Water,ocean,Any,Any,Any,Common,1.8,1,45,5,17,0.85,,,,pacific cod use a chin barbel to investigate cold shelf bottoms. seasonal schools follow prey between deeper water and coastal spawning grounds.,inactive +1407,pacific hake,Cold shelf fish,Salt Water,ocean,Night,Any,Any,Common,1.7,0.3,8,3,9,0.92,,,,pacific hake rise from deep water at night to feed on krill and fish. large schools migrate along the west coast with changing seasons.,inactive +1408,silver hake,Cold shelf fish,Salt Water,ocean,Night,Any,Any,Common,1.7,0.2,5,3,8,0.92,,,,silver hake hunt fish and crustaceans over sandy atlantic shelves. they move upward after dark and return toward the bottom by day.,inactive +1501,chambered nautilus,Cuttlefish and nautiluses,Salt Water,ocean,Night,Any,Required,Legendary,0.05,0.5,3,34,76,0.92,,,,chambered nautiluses regulate buoyancy with gas-filled shell chambers. dozens of small tentacles feel for food in dark reef slopes.,inactive +1502,common cuttlefish,Cuttlefish and nautiluses,Salt Water,ocean,Day,Any,Any,Uncommon,0.55,0.2,12,7,17,0.9,,,,common cuttlefish flash changing colors and patterns through specialized skin cells. an internal cuttlebone controls buoyancy.,inactive +1503,flamboyant cuttlefish,Cuttlefish and nautiluses,Salt Water,ocean,Day,Required,Any,Epic,0.1,0.05,0.4,26,58,0.96,,,,flamboyant cuttlefish walk along the seafloor on their arms and fins. vivid displays warn predators of potent toxins.,inactive +1601,blueline tilefish,Deep shelf fish,Salt Water,ocean,Day,Any,Any,Uncommon,0.7,1,20,7,18,0.86,,,,blueline tilefish shelter in burrows and rocky openings along deep shelves. a narrow blue stripe traces the edge of the dorsal fin.,inactive +1602,golden tilefish,Deep shelf fish,Salt Water,ocean,Day,Any,Any,Rare,0.22,2,50,15,37,0.84,,,,golden tilefish excavate burrows in soft clay along deep ocean slopes. their bright yellow spots contrast with blue-green backs.,inactive +1603,Pacific ocean perch,Deep shelf fish,Salt Water,ocean,Any,Any,Any,Uncommon,0.8,0.3,12,7,17,0.88,,,,pacific ocean perch hover around deep rocky reefs in the north pacific. these slow-growing fish give birth to live young.,inactive +1604,Patagonian toothfish,Deep shelf fish,Salt Water,ocean,Night,Any,Any,Epic,0.09,10,220,32,78,0.8,,,,"patagonian toothfish patrol cold, deep southern water with large canine teeth. natural antifreeze proteins protect their blood from freezing.",inactive +1605,sablefish,Deep shelf fish,Salt Water,ocean,Night,Any,Any,Rare,0.22,2,40,15,36,0.84,,,,"sablefish roam deep north pacific slopes and can live for many decades. soft dark bodies conceal rich, oil-filled flesh.",inactive +1606,wreckfish,Deep shelf fish,Salt Water,ocean,Any,Any,Required,Epic,0.1,10,180,31,76,0.8,,,,"wreckfish gather around caves, ledges, and shipwrecks in deep water. powerful jaws let them ambush fish and large crustaceans.",inactive +1701,giant oarfish,Deep-sea legends,Salt Water,ocean,Night,Any,Required,Legendary,0.035,20,600,60,140,0.78,,,,"giant oarfish drift vertically through deep open water, rowing with a crimson dorsal fin. their ribbon-like bodies can reach remarkable lengths.",inactive +1702,West Indian Ocean coelacanth,Deep-sea legends,Salt Water,ocean,Night,Any,Required,Legendary,0.03,20,200,65,145,0.8,,,,"west indian ocean coelacanths shelter in deep volcanic caves by day. fleshy lobed fins move in an alternating, limb-like rhythm.",inactive +1801,black seadevil,Deep-sea oddities,Salt Water,ocean,Night,Any,Any,Legendary,0.05,0.1,2,48,105,0.92,,,,black seadevils lure prey with a glowing organ suspended above the mouth. tiny males permanently attach to much larger females.,inactive +1802,common fangtooth,Deep-sea oddities,Salt Water,ocean,Night,Any,Any,Epic,0.1,0.05,0.5,25,56,0.96,,,,common fangtooths carry outsized teeth that fit into pockets in the roof of the mouth. they migrate upward from deep water after dark.,inactive +1803,gulper eel,Deep-sea oddities,Salt Water,ocean,Night,Any,Required,Legendary,0.04,0.5,18,44,92,0.86,,,,gulper eels unfold enormous mouths to engulf prey in the deep sea. a whip-like tail ends in a small light-producing organ.,inactive +1804,Pacific barreleye,Deep-sea oddities,Salt Water,ocean,Night,Any,Required,Legendary,0.045,0.2,2.5,42,88,0.9,,,,pacific barreleyes peer upward through transparent shields covering the head. tubular eyes rotate forward when the fish turns to feed.,inactive +1805,smooth-head blobfish,Deep-sea oddities,Salt Water,ocean,Night,Any,Required,Legendary,0.04,0.5,5,42,90,0.86,,,,smooth-head blobfish rest on deep slopes where pressure supports their soft bodies. they conserve energy by waiting for edible matter nearby.,inactive +1806,spotted lanternfish,Deep-sea oddities,Salt Water,ocean,Night,Any,Any,Rare,0.24,0.05,0.5,14,30,0.95,,,,spotted lanternfish carry rows of light-producing organs along their bodies. immense schools rise toward the surface each night.,inactive +1901,crown-of-thorns sea star,Echinoderms,Salt Water,ocean,Night,Required,Any,Epic,0.1,0.5,7,23,52,0.91,,,,crown-of-thorns sea stars crawl over reefs and digest coral tissue outside the body. venomous spines discourage many predators.,inactive +1902,giant California sea cucumber,Echinoderms,Salt Water,ocean,Night,Any,Required,Rare,0.24,0.5,5,13,29,0.93,,,,giant california sea cucumbers sweep organic particles from the seafloor with branching tentacles. soft tube feet anchor their long bodies.,inactive +1903,purple sea urchin,Echinoderms,Salt Water,ocean,Day,Any,Any,Uncommon,0.75,0.05,1,5,12,0.96,,,,purple sea urchins scrape algae from rocks with a five-toothed feeding structure. dense groups can clear kelp from entire reefs.,inactive +1904,sand dollar,Echinoderms,Salt Water,ocean,Day,Any,Forbidden,Uncommon,0.8,0.01,0.2,4,10,0.98,,,,sand dollars burrow just beneath sandy seafloors and filter tiny food particles. the familiar star pattern marks their five-part body plan.,inactive +1905,sunflower sea star,Echinoderms,Salt Water,ocean,Day,Any,Required,Rare,0.25,0.5,13,14,32,0.89,,,,"sunflower sea stars move quickly on thousands of tube feet and may carry many arms. they hunt urchins, clams, and other bottom animals.",inactive +2001,axolotl,Freshwater amphibians,Fresh Water,lake,Night,Any,Required,Legendary,0.04,0.1,0.7,36,78,0.96,,,,axolotls remain aquatic and keep feathery external gills throughout adulthood. lost limbs and parts of several organs can regenerate.,inactive +2002,hellbender,Freshwater amphibians,Fresh Water,river,Night,Required,Any,Epic,0.1,0.5,5.5,24,54,0.91,,,,"hellbenders hide beneath large rocks in cool, clean rivers. folds of loose skin absorb oxygen while the flattened body grips the current.",inactive +2101,guppy,Freshwater aquarium fish,Fresh Water,pond,Day,Any,Any,Common,1.5,0.01,0.15,2,5,0.98,,,,"guppies are livebearers whose young arrive ready to swim. males display bright colors while females often favor larger, less flashy bodies.",inactive +2102,neon tetra,Freshwater aquarium fish,Fresh Water,pond,Night,Any,Any,Uncommon,0.9,0.01,0.08,4,8,0.98,,,,"neon tetras school through shaded forest streams. an iridescent blue stripe remains visible in the dim, tannin-stained water.",inactive +2103,zebrafish,Freshwater aquarium fish,Fresh Water,pond,Day,Any,Any,Common,1.35,0.01,0.12,2,5,0.98,,,,"zebrafish carry horizontal blue stripes from gill to tail. hardy schools thrive in shallow streams, flooded fields, and quiet pools.",inactive +2201,largemouth bass,Freshwater bass,Fresh Water,pond,Any,Any,Any,Common,2.5,0.5,18,4,12,0.9,,,,largemouth bass wait among weeds and timber before lunging at prey. the upper jaw extends beyond the eye when the mouth is closed.,inactive +2202,smallmouth bass,Freshwater bass,Fresh Water,river,Day,Any,Any,Uncommon,1.2,0.5,12,6,15,0.9,,,,smallmouth bass favor clear water with rock and moving current. bronze flanks and dark vertical bars distinguish them from largemouth bass.,inactive +2301,bigmouth buffalo,Freshwater bottom fish,Fresh Water,river,Any,Any,Required,Epic,0.12,8,80,28,63,0.82,,,,bigmouth buffalo filter plankton with fine gill rakers instead of rooting for prey. some individuals survive for more than a century.,inactive +2302,golden redhorse,Freshwater bottom fish,Fresh Water,river,Day,Any,Any,Uncommon,0.9,0.5,8,6,14,0.9,,,,"golden redhorses probe flowing river bottoms with fleshy, downward-facing mouths. coppery scales and reddish fins give them a warm glow.",inactive +2303,quillback,Freshwater bottom fish,Fresh Water,river,Day,Any,Any,Uncommon,0.8,0.5,15,6,16,0.88,,,,quillbacks carry a long first dorsal ray that rises like a quill. small mouths gather insect larvae and other food from river and lake bottoms.,inactive +2304,smallmouth buffalo,Freshwater bottom fish,Fresh Water,river,Any,Any,Any,Rare,0.3,3,45,14,34,0.84,,,,"smallmouth buffalo use thick lips to graze bottom-dwelling food in warm rivers. their deep, heavy bodies form a pronounced arch behind the head.",inactive +2305,white sucker,Freshwater bottom fish,Fresh Water,river,Any,Any,Any,Common,2,0.3,8,3,8,0.9,,,,white suckers vacuum insects and organic matter from cool freshwater bottoms. spring runs carry large groups into shallow streams.,inactive +2401,black bullhead,Freshwater catfish,Fresh Water,pond,Night,Any,Any,Uncommon,1,0.3,6,5,11,0.92,,,,"black bullheads tolerate warm, cloudy water with little oxygen. stout spines protect the dorsal and pectoral fins from predators.",inactive +2402,blue catfish,Freshwater catfish,Fresh Water,river,Night,Any,Any,Uncommon,1.25,3,12,6,9,0.9,,,,a deep fork in the tail inspired the blue catfish's scientific name. it rests deep by daylight and becomes more active after dark.,active +2403,brown bullhead,Freshwater catfish,Fresh Water,pond,Night,Any,Any,Common,2.3,0.2,4,3,7,0.95,,,,brown bullheads search muddy bottoms with eight sensitive barbels. males guard nests and herd newly hatched young in a dark moving ball.,inactive +2404,channel catfish,Freshwater catfish,Fresh Water,pond,Night,Any,Any,Common,2,1.5,7,4,7,1,,,,"a channel catfish can taste through skin all over its body, especially near its gills and whiskers. the male watches the eggs.",active +2405,flathead catfish,Freshwater catfish,Fresh Water,river,Night,Any,Any,Uncommon,1,3,14,7,10,0.9,,,,"flatheads favor hideouts made by logs, rocks, ledges, and other underwater structure. as they grow, fish dominate their menu.",active +2406,tadpole madtom,Freshwater catfish,Fresh Water,river,Night,Any,Any,Rare,0.35,0.02,0.15,8,16,0.95,,,,tadpole madtoms are tiny nocturnal catfish that shelter beneath vegetation and debris. venomous fin spines discourage larger predators.,inactive +2407,white catfish,Freshwater catfish,Fresh Water,pond,Night,Any,Any,Common,2,1,5,4,6,1,,,,white catfish began along the atlantic coast between new york and florida. people later carried them far beyond that home range.,active +2408,yellow bullhead,Freshwater catfish,Fresh Water,pond,Night,Required,Any,Common,2,0.2,3.5,3,7,0.95,,,,yellow bullheads use pale chin barbels to distinguish food in murky shallows. both parents may guard the nest and schooling young.,inactive +2501,common barbel,Freshwater coarse fish,Fresh Water,river,Night,Required,Any,Rare,0.28,1,25,13,31,0.85,,,,common barbels hold close to fast river bottoms with streamlined bodies and broad fins. four mouth barbels locate food among stones.,inactive +2502,common bream,Freshwater coarse fish,Fresh Water,lake,Any,Any,Any,Common,1.8,0.3,15,4,12,0.88,,,,"common bream gather in slow rivers and lakes with silvery, deep-sided bodies. protruding mouths sift insect larvae from soft bottoms.",inactive +2503,common carp,Freshwater coarse fish,Fresh Water,pond,Any,Any,Any,Rare,1.5,3,18,10,10,0.85,,,,whisker-like barbels help a common carp investigate the bottom. nosing through sediment can cloud the water and loosen plants.,active +2504,common roach,Freshwater coarse fish,Fresh Water,pond,Any,Any,Any,Common,2.8,0.1,4,2,6,0.95,,,,"common roach thrive in many lakes and rivers, often schooling near vegetation. red fins and a red-orange eye brighten their silver bodies.",inactive +2505,european chub,Freshwater coarse fish,Fresh Water,river,Any,Any,Any,Common,0.55,0.2,6,2,4,0.9,,,,"european chub are adaptable river fish. adults often patrol shallows and feed on insects, small fish, and fruit.",active +2506,fallfish,Freshwater coarse fish,Fresh Water,river,Day,Required,Any,Uncommon,0.9,0.2,3.5,5,10,0.92,,,,fallfish are large minnows that build broad stone nests in flowing water. other stream fish often reuse the gravel mounds for spawning.,inactive +2507,ide,Freshwater coarse fish,Fresh Water,river,Day,Any,Any,Uncommon,0.8,0.3,9,6,14,0.9,,,,"ide move between rivers, lakes, and brackish coastal water in loose schools. adults eat insects, crustaceans, plants, and small fish.",inactive +2508,rudd,Freshwater coarse fish,Fresh Water,pond,Day,Any,Any,Common,2.4,0.1,4.5,3,7,0.95,,,,"rudd feed near the surface with an upturned mouth and red fins. golden-green bodies disappear easily among warm, weedy shallows.",inactive +2509,tench,Freshwater coarse fish,Fresh Water,pond,Night,Any,Required,Uncommon,0.75,0.5,12,7,17,0.88,,,,"tench browse quiet, muddy bottoms with two small mouth barbels. a thick coat of slime protects their olive-green scales.",inactive +2601,red swamp crayfish,Freshwater crustaceans,Fresh Water,pond,Night,Required,Any,Common,1.1,0.03,0.25,3,7,0.98,,,,"red swamp crayfish burrow into wet ground when water recedes. adaptable populations feed on plants, carrion, and small aquatic animals.",inactive +2701,alligator gar,Freshwater giants,Fresh Water,river,Night,Any,Any,Legendary,0.055,20,300,55,125,0.8,,,,alligator gar combine a broad tooth-filled snout with heavy armor-like scales. a vascular swim bladder lets them breathe air at the surface.,inactive +2702,arapaima,Freshwater giants,Fresh Water,river,Day,Any,Any,Legendary,0.04,40,400,60,140,0.78,,,,arapaima must surface frequently to gulp air through a specialized swim bladder. large armored scales protect their long river-going bodies.,inactive +2703,goliath tigerfish,Freshwater giants,Fresh Water,river,Day,Any,Any,Legendary,0.035,20,150,58,132,0.8,,,,goliath tigerfish patrol powerful african rivers with interlocking dagger-like teeth. a muscular forked tail drives sudden attacks.,inactive +2704,muskellunge,Freshwater giants,Fresh Water,lake,Day,Any,Required,Epic,0.11,8,60,32,72,0.82,,,,muskellunge wait motionless among weeds before exploding toward prey. pale bodies carry bars or spots that fade into broken underwater light.,inactive +2801,common shiner,Freshwater minnows,Fresh Water,river,Day,Any,Any,Common,4,0.03,0.3,1,3,1,,,,common shiners flash silver in clear streams and small rivers. breeding males develop rosy fins and a blue-violet sheen.,inactive +2802,creek chub,Freshwater minnows,Fresh Water,river,Day,Any,Any,Common,3.2,0.05,0.8,2,4,1,,,,creek chubs gather around pools and undercut banks in small streams. males build gravel ridges where several fish may spawn.,inactive +2803,emerald shiner,Freshwater minnows,Fresh Water,lake,Any,Any,Any,Common,3.5,0.03,0.25,1,3,1,,,,emerald shiners form bright surface schools in large lakes and rivers. slender bodies feed on plankton and drifting insects.,inactive +2804,fathead minnow,Freshwater minnows,Fresh Water,pond,Day,Any,Any,Common,4.5,0.02,0.2,1,2,1,,,,"fathead minnows tolerate warm, muddy ponds where many fish struggle. males guard eggs laid beneath rocks, logs, and other cover.",inactive +2805,flame chub,Freshwater minnows,Fresh Water,river,Any,Any,Any,Uncommon,0.4,0.05,0.15,3,6,0.9,,,,"flame chubs prefer cool, clear streams. their bright breeding colors make a small fish easy to spot in spring water.",active +2806,golden shiner,Freshwater minnows,Fresh Water,pond,Day,Any,Any,Common,3.8,0.05,1,2,4,1,,,,golden shiners school around dense vegetation in warm water. an upturned mouth takes insects and plankton from near the surface.,inactive +2807,lake chub,Freshwater minnows,Fresh Water,lake,Any,Any,Any,Common,0.55,0.05,0.5,2,4,0.9,,,,lake chubs school in cold northern water and use their small mouths to pick insects and other tiny prey from the current.,active +2901,electric eel,Freshwater oddities,Fresh Water,river,Night,Required,Any,Epic,0.1,1,44,25,60,0.82,,,,electric eels navigate and hunt with electrical pulses produced along most of the body. they must surface regularly to breathe air.,inactive +2902,freshwater drum,Freshwater oddities,Fresh Water,river,Night,Required,Any,Uncommon,0.7,1,35,7,20,0.85,,,,freshwater drum crush snails and mussels with powerful throat teeth. muscles vibrating against the swim bladder produce a low drumming sound.,inactive +2903,goldeye,Freshwater oddities,Fresh Water,river,Night,Any,Required,Rare,0.3,0.3,6,12,25,0.9,,,,goldeye patrol turbid rivers with large light-sensitive eyes and a toothed tongue. they rise toward the surface to hunt insects and small fish.,inactive +2904,mooneye,Freshwater oddities,Fresh Water,river,Night,Any,Any,Uncommon,0.85,0.2,4,5,11,0.92,,,,mooneyes flash silver in clear rivers and lakes while feeding near the surface. their large eyes suit evening hunts for insects and small fish.,inactive +2905,weather loach,Freshwater oddities,Fresh Water,pond,Any,Required,Any,Uncommon,0.85,0.05,0.7,5,11,0.95,,,,weather loaches gulp air and pass it through the intestine when oxygen runs low. restless activity often increases as air pressure falls.,inactive +3001,bubble-eye goldfish,Freshwater ornamental,Fresh Water,pond,Any,Any,Any,Uncommon,0.35,0.1,0.35,3,7,0.9,,,,"bubble-eye goldfish have delicate fluid-filled sacs beneath their eyes, making careful handling especially important.",active +3002,goldfish,Freshwater ornamental,Fresh Water,pond,Any,Any,Any,Common,0.5,0.1,4,1,3,0.9,,,,"goldfish can tolerate a surprisingly wide range of conditions. their wild relatives often live in slow, weedy water.",active +3003,koi,Freshwater ornamental,Fresh Water,pond,Day,Any,Forbidden,Rare,0.28,0.5,35,14,34,0.87,,,,koi are colorful domesticated forms of common carp selected over many generations. each fish carries a distinctive arrangement of patches and scales.,inactive +3101,black crappie,Freshwater panfish,Fresh Water,pond,Any,Any,Required,Uncommon,1,0.2,4,5,11,0.9,,,,black crappie gather around submerged wood and vegetation in clear water. irregular dark speckles scatter across their deep silver bodies.,inactive +3102,bluegill,Freshwater panfish,Fresh Water,pond,Day,Any,Any,Common,10,0.3,2,3,3,1,,,,"bluegill fathers sweep shallow bowls into the bottom for nests, then stand guard. whole neighborhoods of nests can crowd together.",active +3103,green sunfish,Freshwater panfish,Fresh Water,pond,Day,Any,Any,Common,3.2,0.1,1.5,2,5,1,,,,"green sunfish tolerate small, warm, cloudy pools better than many relatives. a large mouth lets them tackle insects, crayfish, and fish.",inactive +3104,pumpkinseed,Freshwater panfish,Fresh Water,pond,Day,Any,Any,Common,3,0.1,1.3,2,5,1,,,,pumpkinseeds use compact teeth to crush snails and other hard prey. blue facial lines and an orange gill spot brighten their round bodies.,inactive +3105,redear sunfish,Freshwater panfish,Fresh Water,pond,Day,Any,Any,Uncommon,1.1,0.2,3,4,9,0.95,,,,"redear sunfish specialize in snails, crushing shells with strong throat teeth. a red or orange margin marks the dark flap behind the gill.",inactive +3106,warmouth,Freshwater panfish,Fresh Water,pond,Night,Required,Any,Uncommon,0.8,0.2,2,5,10,0.95,,,,"warmouth hide in weeds, roots, and murky backwaters before ambushing prey. red eyes and dark cheek stripes frame a notably large mouth.",inactive +3107,white crappie,Freshwater panfish,Fresh Water,lake,Night,Any,Any,Common,1.7,0.2,4.5,4,9,0.9,,,,"white crappie favor warm, cloudy water and gather around structure. vertical bars cross their silver sides instead of scattered speckles.",inactive +3201,yellow perch,Freshwater perch,Fresh Water,lake,Day,Any,Any,Common,2.2,0.2,4,3,8,0.9,,,,yellow perch travel in schools through cool lakes and slow rivers. dark vertical bars and orange lower fins make them easy to recognize.,inactive +3301,chain pickerel,Freshwater predators,Fresh Water,pond,Day,Required,Any,Uncommon,0.8,0.5,9,6,15,0.9,,,,chain pickerel hover among vegetation before darting at fish and frogs. a chain-like pattern breaks up their green flanks.,inactive +3302,grass pickerel,Freshwater predators,Fresh Water,pond,Day,Any,Any,Common,2.1,0.1,1.5,2,6,0.95,,,,"grass pickerel remain small enough to hunt in narrow, weedy creeks and marshes. dark bars camouflage their slim bodies among stems.",inactive +3303,northern pike,Freshwater predators,Fresh Water,lake,Day,Any,Any,Uncommon,0.75,1,30,8,24,0.85,,,,northern pike are solitary ambush hunters built for sudden acceleration. pale bean-shaped spots cover their long green bodies.,inactive +3304,sauger,Freshwater predators,Fresh Water,river,Any,Any,Any,Uncommon,0.35,0.5,8,6,12,0.9,,,,"sauger favor turbid rivers and reservoirs. their mottled backs blend into the dim, shifting light near the bottom.",active +3305,saugeye,Freshwater predators,Fresh Water,lake,Any,Any,Any,Rare,0.2,0.5,12,9,18,0.9,,,,saugeye are a fertile hybrid of sauger and walleye. they combine traits from both parent species and often grow quickly.,active +3306,walleye,Freshwater predators,Fresh Water,lake,Any,Any,Any,Uncommon,0.4,0.5,15,7,15,0.9,,,,walleye have light-sensitive eyes that help them hunt in murky water and around dusk. their reflective layer gives the eyes a pale glow.,active +3401,round goby,Freshwater small fish,Fresh Water,lake,Any,Any,Any,Common,8,0.1,0.6,2,3,1,,,,round gobies use fused pelvic fins like a suction cup to hold onto rocks. they are small fish with a famously large appetite.,active +3501,crystal jelly,Jellies,Salt Water,ocean,Night,Any,Forbidden,Rare,0.24,0.05,4,15,34,0.93,,,,crystal jellies are nearly transparent except for glowing points around the bell. their green fluorescent protein transformed biological research.,inactive +3502,lion's mane jelly,Jellies,Salt Water,ocean,Night,Any,Required,Epic,0.11,1,200,24,58,0.82,,,,lion's mane jellies trail dense curtains of tentacles through cold seas. the bell darkens from yellow to deep red as the animal grows.,inactive +3503,moon jelly,Jellies,Salt Water,ocean,Night,Any,Any,Uncommon,0.7,0.05,5,6,14,0.94,,,,moon jellies pulse gently with four horseshoe-shaped organs visible through the bell. short tentacles sweep plankton toward the mouth.,inactive +3504,Pacific sea nettle,Jellies,Salt Water,ocean,Day,Any,Forbidden,Rare,0.28,0.2,12,14,32,0.9,,,,pacific sea nettles carry rust-colored stripes across pale bells. long tentacles and frilled mouth arms capture plankton and small fish.,inactive +3505,sea wasp,Jellies,Salt Water,ocean,Day,Required,Any,Legendary,0.035,0.2,6,42,90,0.9,,,,sea wasps have box-shaped bells and clusters of eyes along the lower edge. their long tentacles deliver exceptionally potent venom.,inactive +3601,African pompano,Large coastal predators,Salt Water,ocean,Any,Any,Any,Rare,0.26,2,50,14,35,0.84,,,,african pompano develop long streaming fin rays while young. adults become deep-bodied silver hunters around reefs and offshore structure.,inactive +3602,cobia,Large coastal predators,Salt Water,ocean,Day,Any,Any,Rare,0.24,5,80,15,40,0.82,,,,"cobia often follow sharks, rays, and floating structures in warm seas. a broad dark stripe runs along their long, powerful bodies.",inactive +3603,giant trevally,Large coastal predators,Salt Water,ocean,Day,Any,Any,Epic,0.1,10,150,32,78,0.8,,,,giant trevally hunt reef edges with bursts of speed and force. large individuals sometimes charge prey from surf and shallow lagoons.,inactive +3604,greater amberjack,Large coastal predators,Salt Water,ocean,Any,Any,Any,Rare,0.25,5,90,15,42,0.82,,,,"greater amberjacks circle reefs, wrecks, and offshore platforms. a dark stripe crosses the eye of their sturdy torpedo-shaped bodies.",inactive +3605,lesser amberjack,Large coastal predators,Salt Water,ocean,Any,Any,Any,Uncommon,0.75,1,20,7,18,0.86,,,,lesser amberjacks school around deep reefs and floating objects. an enlarged eye suits their preference for dimmer water.,inactive +3701,atlantic halibut,Large flatfish,Salt Water,ocean,Any,Any,Any,Epic,0.1,10,300,32,82,0.8,,,,atlantic halibut are immense right-eyed flatfish of cold northern seas. adults ambush fish and squid from deep rocky or sandy bottoms.,inactive +3702,pacific halibut,Large flatfish,Salt Water,ocean,Any,Any,Any,Epic,0.1,10,350,34,86,0.8,,,,pacific halibut lie camouflaged on cold continental shelves. powerful flat bodies can travel long distances between feeding and spawning grounds.,inactive +3703,turbot,Large flatfish,Salt Water,ocean,Any,Any,Required,Rare,0.24,1,35,14,34,0.85,,,,"turbot have broad, nearly circular bodies covered with bony bumps instead of scales. they bury into sand before ambushing fish and crustaceans.",inactive +3801,American lobster,Lobsters and shrimp,Salt Water,ocean,Night,Any,Required,Rare,0.28,0.5,44,16,42,0.86,,,,american lobsters shelter in rocky crevices and emerge to forage along the bottom. one claw crushes while the other cuts and grips.,inactive +3802,Antarctic krill,Lobsters and shrimp,Salt Water,ocean,Night,Any,Any,Rare,0.3,0.001,0.01,10,22,0.99,,,,"antarctic krill form enormous swarms beneath southern seas and ice. these small crustaceans feed whales, seals, penguins, and fish.",inactive +3803,Caribbean spiny lobster,Lobsters and shrimp,Salt Water,ocean,Night,Any,Forbidden,Rare,0.25,0.5,26,15,38,0.87,,,,caribbean spiny lobsters rely on long antennae and a thorny shell instead of large claws. groups march together across the seafloor.,inactive +3804,peacock mantis shrimp,Lobsters and shrimp,Salt Water,ocean,Day,Required,Any,Epic,0.1,0.05,0.4,22,50,0.96,,,,peacock mantis shrimp strike hard-shelled prey with club-like limbs. complex eyes move independently and detect colors beyond human vision.,inactive +3805,skunk cleaner shrimp,Lobsters and shrimp,Salt Water,ocean,Day,Any,Forbidden,Uncommon,0.75,0.01,0.15,5,11,0.98,,,,skunk cleaner shrimp advertise at reef cleaning stations with bright white antennae. visiting fish pause while parasites are picked away.,inactive +3901,Atlantic ghost crab,Marine crabs,Salt Water,ocean,Night,Any,Forbidden,Rare,0.28,0.02,0.5,11,24,0.97,,,,atlantic ghost crabs dash across beaches on long pale legs and retreat into deep burrows. raised eyes scan nearly every direction.,inactive +3902,blue crab,Marine crabs,Salt Water,ocean,Day,Any,Any,Common,1.15,0.1,1.1,3,8,0.95,,,,"blue crabs swim with flattened rear legs shaped like paddles. bright blue claws and an olive shell conceal a quick, defensive temperament.",inactive +3903,Dungeness crab,Marine crabs,Salt Water,ocean,Day,Any,Required,Uncommon,0.65,0.5,3,6,14,0.92,,,,dungeness crabs bury beneath sand with only their eyes and antennae exposed. broad toothed shells protect them along cool pacific coasts.,inactive +3904,Japanese spider crab,Marine crabs,Salt Water,ocean,Night,Any,Any,Legendary,0.045,5,44,38,88,0.84,,,,japanese spider crabs carry the longest leg span of any living arthropod. adults roam deep seafloors around japan.,inactive +3905,red king crab,Marine crabs,Salt Water,ocean,Night,Any,Required,Epic,0.11,2,24,24,58,0.85,,,,"red king crabs stride over cold northern bottoms on long armored legs. despite the name, they are closer to hermit crabs than true crabs.",inactive +4001,american eel,Migratory eels,Fresh Water | Salt Water,river,Night,Required,Any,Rare,0.25,0.3,8,12,27,0.88,,,,american eels hatch far out in the sargasso sea before entering freshwater rivers. adults later reverse the journey to spawn once.,inactive +4002,european eel,Migratory eels,Fresh Water | Salt Water,river,Night,Any,Required,Rare,0.2,0.3,10,13,30,0.88,,,,european eels cross the atlantic as transparent larvae before entering rivers and lakes. mature silver eels return to sea to reproduce.,inactive +4101,rainbow smelt,Migratory forage fish,Fresh Water | Salt Water,lake,Night,Any,Any,Common,2.5,0.05,0.8,2,5,1,,,,"rainbow smelt move between coastal water and rivers, though some remain landlocked. cucumber-like aromas cling to freshly caught fish.",inactive +4201,eulachon,Ocean-run forage fish,Fresh Water | Salt Water,river,Night,Required,Any,Uncommon,0.9,0.05,0.5,4,9,0.98,,,,eulachon return from the pacific to spawn in coastal rivers. their oil-rich bodies once served as candles when dried and fitted with wicks.,inactive +4301,white sturgeon,Ocean-run giants,Fresh Water | Salt Water,river,Night,Any,Any,Legendary,0.045,20,500,58,135,0.78,,,,white sturgeon are the largest freshwater fish in north america. armored plates line bodies built for long lives in rivers and estuaries.,inactive +4401,atlantic salmon,Ocean-run salmon,Salt Water,ocean,Any,Any,Any,Epic,0.65,8,40,20,42,0.85,,,,"atlantic salmon can return from the ocean to the river where they hatched. unlike many salmon, some survive to make the trip again.",active +4402,chum salmon,Ocean-run salmon,Salt Water,ocean,Any,Any,Any,Uncommon,2.5,6,25,10,22,0.9,,,,chum salmon travel immense distances and develop striking bars when they return to fresh water to spawn.,active +4403,coho salmon,Ocean-run salmon,Salt Water,ocean,Any,Any,Any,Rare,1.4,5,30,14,28,0.88,,,,coho salmon are agile hunters known for powerful leaps. young coho may spend more than a year growing in streams.,active +4404,pink salmon,Ocean-run salmon,Salt Water,ocean,Any,Any,Any,Uncommon,3,3,12,8,15,0.92,,,,pink salmon usually follow a strict two-year life cycle. spawning males develop the hump that inspired their nickname.,active +4405,sockeye salmon,Ocean-run salmon,Salt Water,ocean,Any,Any,Any,Rare,1.6,4,15,12,24,0.9,,,,sockeye salmon feed heavily on plankton at sea. adults turn vivid red as they return inland to spawn.,active +4501,steelhead trout,Ocean-run salmonids,Fresh Water,river,Any,Any,Any,Rare,0.2,2,35,10,20,0.9,,,,steelhead are the ocean-going form of rainbow trout. adults can leave fresh water and later return to spawn.,active +4601,black marlin,Oceanic billfish,Salt Water,ocean,Any,Any,Any,Epic,0.08,80,700,45,90,0.9,,,,black marlin are powerful billfish that spend much of their lives in warm open ocean and can make blistering runs.,active +4602,blue marlin,Oceanic billfish,Salt Water,ocean,Any,Any,Any,Legendary,0.05,100,1000,60,120,0.9,,,,blue marlin are highly migratory open-ocean hunters. their long bill helps them stun prey before turning back to feed.,active +4603,sailfish,Oceanic billfish,Salt Water,ocean,Any,Any,Any,Epic,0.1,30,200,38,78,0.9,,,,sailfish raise their enormous dorsal fin while herding baitfish. they are among the fastest fish in the sea.,active +4604,swordfish,Oceanic billfish,Salt Water,ocean,Any,Any,Any,Legendary,0.06,50,1000,55,110,0.9,,,,"swordfish are fast, wide-ranging predators with a flattened bill. they can cross deep water and warm surface layers in one day.",active +4605,white marlin,Oceanic billfish,Salt Water,ocean,Any,Any,Any,Epic,0.1,30,180,35,70,0.9,,,,white marlin favor warm offshore water and use their rounded dorsal fin and bill to weave through schools of prey.,active +4701,mahi-mahi,Oceanic pelagic fish,Salt Water,ocean,Day,Any,Forbidden,Rare,0.28,2,50,15,38,0.84,,,,"mahi-mahi flash brilliant blue, green, and gold while chasing prey near the surface. they grow quickly and gather around floating objects.",inactive +4702,opah,Oceanic pelagic fish,Salt Water,ocean,Day,Any,Forbidden,Epic,0.09,20,600,36,88,0.8,,,,"opah circulate warm blood through much of the body, an unusual trait among fish. round silver flanks glow with red fins and pale spots.",inactive +4703,wahoo,Oceanic pelagic fish,Salt Water,ocean,Day,Any,Any,Epic,0.11,10,100,30,70,0.82,,,,wahoo are streamlined open-ocean hunters with rows of sharp teeth. blue vertical bars flicker across their sides during fast pursuits.,inactive +4801,albacore tuna,Oceanic tuna,Salt Water,ocean,Any,Any,Any,Rare,1.5,10,45,12,24,0.85,,,,albacore have unusually long pectoral fins. their warm muscles help them cruise across wide stretches of open ocean.,active +4802,bigeye tuna,Oceanic tuna,Salt Water,ocean,Any,Any,Any,Epic,0.55,20,120,22,48,0.8,,,,"bigeye tuna make daily trips between deep, cool water and warmer surface layers. their large eyes suit those dim depths.",active +4803,bluefin tuna,Oceanic tuna,Salt Water,ocean,Any,Any,Any,Legendary,0.18,30,250,35,90,0.78,,,,bluefin tuna are powerful ocean travelers. heat retained in their swimming muscles lets them thrive in surprisingly cold seas.,active +4804,skipjack tuna,Oceanic tuna,Salt Water,ocean,Any,Any,Any,Uncommon,3,5,25,8,16,0.9,,,,skipjack travel in fast-moving schools and have dark stripes along their lower sides. they rarely stop swimming.,active +4805,yellowfin tuna,Oceanic tuna,Salt Water,ocean,Any,Any,Any,Rare,1,15,80,16,36,0.82,,,,yellowfin are named for their bright yellow fins and finlets. large schools often gather with other open-ocean hunters.,active +4901,common octopus,Octopuses,Salt Water,ocean,Night,Any,Any,Uncommon,0.65,0.2,22,7,18,0.87,,,,common octopuses squeeze through narrow cracks and solve problems while hunting reefs. skin cells rapidly change color and texture.,inactive +4902,day octopus,Octopuses,Salt Water,ocean,Day,Any,Forbidden,Rare,0.24,0.2,15,15,36,0.88,,,,"day octopuses forage across tropical reefs while the sun is high. shifting bars and spots communicate alarm, camouflage, and threat.",inactive +4903,giant Pacific octopus,Octopuses,Salt Water,ocean,Night,Any,Required,Epic,0.1,5,200,28,70,0.81,,,,giant pacific octopuses explore cold rocky dens with thousands of arm suckers. females guard their eggs without feeding until they hatch.,inactive +4904,greater blue-ringed octopus,Octopuses,Salt Water,ocean,Day,Required,Any,Legendary,0.04,0.05,0.3,38,82,0.96,,,,greater blue-ringed octopuses reveal vivid rings when threatened. a tiny beak can deliver venom strong enough to stop breathing.,inactive +5001,sunfish,Open-ocean giants,Salt Water,ocean,Day,Any,Any,Common,7,0.4,2.5,3,3,1,,,,ocean sunfish are built more like enormous swimming heads than ordinary fish. they visit the surface and turn sideways to warm up.,active +5101,barndoor skate,Rays and skates,Salt Water,ocean,Any,Any,Required,Epic,0.1,5,150,28,68,0.8,,,,barndoor skates glide over cold atlantic bottoms with broad wing-like fins. rows of thorny spines protect the back and tail.,inactive +5102,giant manta ray,Rays and skates,Salt Water,ocean,Day,Any,Forbidden,Legendary,0.025,100,1000,65,150,0.76,,,,giant manta rays funnel plankton into wide mouths with two flexible head fins. each belly carries a unique pattern of dark spots.,inactive +5103,largetooth sawfish,Rays and skates,Salt Water,ocean,Night,Required,Any,Legendary,0.035,25,1300,58,135,0.78,,,,largetooth sawfish detect hidden prey with a long sensory rostrum. a swift sideways sweep stuns fish and exposes animals buried in mud.,inactive +5104,ocellate river stingray,Rays and skates,Fresh Water,river,Day,Required,Any,Epic,0.09,2,35,28,65,0.82,,,,ocellate river stingrays carry bright eye-like spots across a round disc. they hide beneath sand in south american rivers.,inactive +5105,southern stingray,Rays and skates,Salt Water,ocean,Day,Any,Any,Rare,0.23,2,80,15,40,0.82,,,,southern stingrays bury in warm sand with only their eyes and spiracles visible. crushing plates break open clams and crustaceans.,inactive +5201,red lionfish,Reef ambush fish,Salt Water,ocean,Night,Any,Any,Rare,0.3,0.2,3,11,25,0.92,,,,red lionfish spread ornate venomous spines when threatened. broad fins herd smaller fish into corners before a rapid gulp.,inactive +5202,red scorpionfish,Reef ambush fish,Salt Water,ocean,Night,Any,Any,Rare,0.3,0.2,7,11,25,0.9,,,,red scorpionfish vanish against rocky reefs through mottled color and skin flaps. venomous dorsal spines punish careless predators.,inactive +5301,green moray,Reef eels,Salt Water,ocean,Night,Any,Any,Rare,0.28,1,30,13,32,0.86,,,,green morays appear green because yellow mucus coats blue-gray skin. a second set of jaws pulls captured prey deeper into the throat.,inactive +5401,peacock flounder,Reef flatfish,Salt Water,ocean,Day,Any,Any,Rare,0.3,0.2,5,11,24,0.9,,,,peacock flounders change their spots and colors to match tropical sand. both eyes scan above while the flat body remains concealed.,inactive +5501,blue tang,Reef grazers,Salt Water,ocean,Day,Any,Any,Uncommon,0.9,0.05,1.5,5,11,0.95,,,,blue tangs graze algae from coral reefs with small close-set teeth. sharp folding spines near the tail give surgeonfish their name.,inactive +5502,rainbow parrotfish,Reef grazers,Salt Water,ocean,Day,Any,Any,Epic,0.12,2,40,25,58,0.84,,,,rainbow parrotfish scrape algae from reefs with fused beak-like teeth. crushed coral passes through them and returns to the reef as sand.,inactive +5503,stoplight parrotfish,Reef grazers,Salt Water,ocean,Day,Any,Any,Rare,0.28,0.5,15,12,29,0.88,,,,stoplight parrotfish change color dramatically as they mature. powerful dental plates bite algae from hard reef surfaces.,inactive +5504,yellow tang,Reef grazers,Salt Water,ocean,Day,Forbidden,Any,Rare,0.35,0.05,0.8,9,20,0.96,,,,yellow tangs browse algae across hawaiian reefs during daylight. at night their bright bodies darken and show a pale horizontal stripe.,inactive +5601,atlantic trumpetfish,Reef oddities,Salt Water,ocean,Day,Any,Any,Rare,0.3,0.1,2,10,24,0.94,,,,atlantic trumpetfish hover head-down among corals and sea fans. long tubular snouts expand suddenly to draw in small fish.,inactive +5602,gray triggerfish,Reef oddities,Salt Water,ocean,Day,Any,Any,Uncommon,0.8,0.3,12,7,17,0.88,,,,"gray triggerfish lock a stout dorsal spine upright when wedged into shelter. strong teeth crack barnacles, crabs, and shellfish.",inactive +5603,guineafowl puffer,Reef oddities,Salt Water,ocean,Day,Any,Any,Rare,0.3,0.2,5,11,26,0.9,,,,guineafowl puffers swallow water to inflate when threatened. adults may shift from a spotted dark pattern to a vivid yellow form.,inactive +5604,longhorn cowfish,Reef oddities,Salt Water,ocean,Day,Any,Required,Epic,0.13,0.1,2,23,52,0.94,,,,longhorn cowfish wear a rigid box of fused scales with horns above the eyes. small fins steer the angular body with surprising precision.,inactive +5605,queen triggerfish,Reef oddities,Salt Water,ocean,Day,Any,Forbidden,Rare,0.25,0.5,15,14,32,0.88,,,,queen triggerfish blow jets of water to uncover buried prey and flip sea urchins. vivid blue lines radiate across the face.,inactive +5606,red cornetfish,Reef oddities,Salt Water,ocean,Day,Any,Required,Epic,0.11,0.2,4,24,55,0.92,,,,red cornetfish stalk reefs with extremely long bodies and tubular snouts. a trailing filament extends from the center of the tail.,inactive +5607,spotted porcupinefish,Reef oddities,Salt Water,ocean,Night,Any,Required,Epic,0.12,0.5,7,24,54,0.9,,,,spotted porcupinefish inflate until long spines stand outward. fused teeth form a strong beak for crushing shelled prey.,inactive +5608,yellow boxfish,Reef oddities,Salt Water,ocean,Day,Any,Any,Rare,0.32,0.03,0.8,10,22,0.96,,,,yellow boxfish juveniles are bright cubes covered in black spots. rigid body armor leaves small fins to provide careful steering.,inactive +5701,copperband butterflyfish,Reef ornamentals,Salt Water,ocean,Day,Any,Forbidden,Rare,0.32,0.03,0.4,9,21,0.98,,,,copperband butterflyfish probe reef cracks with long narrow snouts. bold orange bands and a false eyespot confuse predators.,inactive +5702,ocellaris clownfish,Reef ornamentals,Salt Water,ocean,Day,Any,Any,Uncommon,1,0.01,0.15,5,10,1,,,,ocellaris clownfish shelter safely among stinging anemone tentacles. each group is led by a female that develops from the largest male.,inactive +5703,queen angelfish,Reef ornamentals,Salt Water,ocean,Day,Any,Any,Rare,0.3,0.1,2,11,25,0.94,,,,queen angelfish graze sponges from warm atlantic reefs. a blue-ringed spot on the forehead resembles a tiny crown.,inactive +5801,Atlantic goliath grouper,Reef predators,Salt Water,ocean,Any,Any,Required,Legendary,0.05,20,800,50,125,0.78,,,,"atlantic goliath groupers occupy reefs, wrecks, and mangrove roots. enormous mouths pull prey inward with a sudden pressure drop.",inactive +5802,bluefin trevally,Reef predators,Salt Water,ocean,Day,Any,Forbidden,Rare,0.3,1,25,14,32,0.86,,,,bluefin trevally hunt reef fish in coordinated groups. electric blue fins and scattered blue spots contrast with a golden body.,inactive +5803,giant grouper,Reef predators,Salt Water,ocean,Any,Any,Required,Legendary,0.045,20,880,52,128,0.78,,,,giant groupers become massive ambush predators around indo-pacific reefs. juveniles carry bold black-and-yellow markings.,inactive +5804,great barracuda,Reef predators,Salt Water,ocean,Day,Any,Required,Epic,0.12,5,80,28,65,0.82,,,,great barracudas hover motionless before accelerating toward prey. long jaws carry two distinct rows of sharp teeth.,inactive +5805,gulf grouper,Reef predators,Salt Water,ocean,Any,Any,Any,Uncommon,0.3,2,40,10,24,0.9,,,,gulf grouper are ambush predators that use a sudden gulp to pull prey into their cavernous mouths.,active +5806,Nassau grouper,Reef predators,Salt Water,ocean,Any,Any,Forbidden,Epic,0.12,2,55,25,62,0.82,,,,nassau groupers shift their bars and colors with mood and surroundings. adults gather at traditional reef sites to spawn.,inactive +5807,red grouper,Reef predators,Salt Water,ocean,Any,Any,Any,Rare,0.2,2,30,16,36,0.9,,,,red grouper excavate shelters in reef rubble. the hollows they make can become hiding places for many smaller animals.,active +5901,blue-green chromis,Reef schooling fish,Salt Water,ocean,Day,Any,Any,Common,2.8,0.01,0.25,2,4,1,,,,blue-green chromis form loose clouds above branching coral. the school dives into narrow shelter whenever a predator approaches.,inactive +5902,bluestriped grunt,Reef schooling fish,Salt Water,ocean,Day,Any,Any,Common,2,0.1,3,3,7,0.94,,,,bluestriped grunts shelter on reefs by day and spread over seagrass to feed at night. grinding throat teeth produce audible grunts.,inactive +5903,French grunt,Reef schooling fish,Salt Water,ocean,Day,Any,Any,Common,2,0.1,3.5,3,7,0.94,,,,french grunts gather in yellow-striped schools around reefs and wrecks. they travel into nearby sand and grass beds after dark.,inactive +5904,sergeant major,Reef schooling fish,Salt Water,ocean,Day,Any,Any,Common,2.5,0.02,0.5,2,5,0.98,,,,sergeant majors guard purple egg patches on hard reef surfaces. five dark bars cross their yellow and silver bodies.,inactive +6001,lane snapper,Reef snapper,Salt Water,ocean,Any,Any,Any,Common,0.45,0.5,5,5,11,0.9,,,,lane snapper use reef structure for cover and hunt small crustaceans and fish when the light begins to fade.,active +6002,mangrove snapper,Reef snapper,Salt Water,ocean,Any,Any,Any,Uncommon,0.35,0.5,12,7,16,0.9,,,,"mangrove snapper shelter among roots and docks when young, then move toward reefs as they grow.",active +6003,mutton snapper,Reef snapper,Salt Water,ocean,Any,Any,Any,Rare,0.2,2,30,12,28,0.9,,,,"mutton snapper have canine teeth that help them pick crabs, shrimp, and other hard-shelled prey from the reef.",active +6004,red snapper,Reef snapper,Salt Water,ocean,Any,Any,Any,Uncommon,0.35,1,25,8,19,0.9,,,,"red snapper gather around reefs, wrecks, and ledges. their diet includes small fish, shrimp, and squid.",active +6101,ballan wrasse,Reef wrasses,Salt Water,ocean,Day,Any,Any,Uncommon,0.8,0.2,10,6,15,0.9,,,,ballan wrasse crush shellfish and sea urchins with strong throat teeth. thick lips and mottled colors suit rocky european reefs.,inactive +6102,cleaner wrasse,Reef wrasses,Salt Water,ocean,Day,Any,Forbidden,Rare,0.35,0.01,0.2,9,20,1,,,,cleaner wrasses advertise with a bright stripe and dance at reef stations. larger fish wait while parasites are picked from skin and gills.,inactive +6103,hogfish,Reef wrasses,Salt Water,ocean,Day,Any,Any,Rare,0.3,0.5,20,12,30,0.86,,,,hogfish root through sand with long pig-like snouts in search of shellfish. adults can change from female to male as social groups shift.,inactive +6201,green sea turtle,Sea turtles,Salt Water,ocean,Day,Any,Forbidden,Legendary,0.018,65,500,62,145,0.78,,,,green sea turtles graze seagrass meadows with finely serrated jaws. adults migrate long distances between feeding and nesting grounds.,inactive +6202,hawksbill sea turtle,Sea turtles,Salt Water,ocean,Day,Required,Any,Legendary,0.014,75,250,66,150,0.8,,,,hawksbill sea turtles reach into reef crevices with narrow hooked beaks. a diet rich in sponges helps shape coral communities.,inactive +6203,leatherback sea turtle,Sea turtles,Salt Water,ocean,Night,Any,Required,Legendary,0.012,500,2000,75,175,0.76,,,,leatherback sea turtles cross entire oceans while hunting jellies. a flexible ridged shell and internal heat help them enter cold water.,inactive +6204,loggerhead sea turtle,Sea turtles,Salt Water,ocean,Day,Any,Any,Legendary,0.016,150,1200,68,155,0.77,,,,loggerhead sea turtles crush crabs and mollusks with massive jaws. females often return near their birth beaches to nest.,inactive +6301,leafy seadragon,Seahorses and seadragons,Salt Water,ocean,Day,Any,Forbidden,Epic,0.1,0.1,0.5,24,55,0.94,,,,leafy seadragons drift among seaweed with elaborate skin lobes that resemble leaves. males carry eggs beneath the tail.,inactive +6302,weedy seadragon,Seahorses and seadragons,Salt Water,ocean,Day,Any,Required,Rare,0.22,0.1,0.6,16,38,0.93,,,,weedy seadragons rely on slender bodies and small leaf-like lobes for camouflage. males brood rows of eggs on the underside of the tail.,inactive +6401,black-lip pearl oyster,Shellfish,Salt Water,ocean,Day,Any,Any,Rare,0.22,0.1,5,14,40,0.91,,,,black-lip pearl oysters line their shells with dark-edged nacre. a trapped irritant can become coated in the same pearly material.,inactive +6402,giant clam,Shellfish,Salt Water,ocean,Day,Any,Forbidden,Epic,0.1,5,500,28,72,0.8,,,,giant clams host photosynthetic algae inside brightly colored mantles. heavy shells remain anchored to one reef spot throughout adulthood.,inactive +6403,Pacific geoduck,Shellfish,Salt Water,ocean,Day,Any,Required,Rare,0.25,0.5,15,14,34,0.88,,,,pacific geoducks bury their shells deep while a long siphon reaches the seafloor. these clams can survive for well over a century.,inactive +6404,queen conch,Shellfish,Salt Water,ocean,Day,Any,Forbidden,Rare,0.24,1,5,15,36,0.91,,,,queen conchs graze algae with a long flexible snout. adults develop a broad flared shell lip and move by vaulting on one muscular foot.,inactive +6405,red abalone,Shellfish,Salt Water,ocean,Day,Any,Required,Epic,0.09,0.2,12,24,56,0.88,,,,red abalones cling to pacific rocks with broad muscular feet. rows of shell holes release water that has passed over the gills.,inactive +6501,bigfin reef squid,Squid,Salt Water,ocean,Day,Any,Forbidden,Rare,0.3,0.2,5,13,30,0.91,,,,bigfin reef squid hover in coordinated groups around warm reefs. shifting colors and body patterns signal to nearby squid.,inactive +6502,colossal squid,Squid,Salt Water,ocean,Night,Required,Any,Legendary,0.015,400,1100,82,190,0.76,,,,colossal squid carry swiveling hooks on their arms and tentacles. enormous eyes gather faint light in the deep southern ocean.,inactive +6503,giant squid,Squid,Salt Water,ocean,Night,Any,Required,Legendary,0.02,100,600,70,165,0.77,,,,giant squid hunt deep ocean prey with two long feeding tentacles. the largest eyes in the animal world watch for movement in darkness.,inactive +6504,Humboldt squid,Squid,Salt Water,ocean,Night,Any,Any,Epic,0.09,5,110,26,64,0.82,,,,humboldt squid flash red and white while hunting in large groups. powerful beaks and grasping suckers handle fish and other squid.,inactive +6601,ballyhoo,Surface ocean fish,Salt Water,ocean,Day,Any,Any,Common,2.5,0.05,1,2,5,0.98,,,,ballyhoo skim warm ocean surfaces with an extended lower jaw. tight schools scatter into quick leaps when predators strike.,inactive +6602,houndfish,Surface ocean fish,Salt Water,ocean,Day,Any,Any,Rare,0.3,0.5,10,11,25,0.88,,,,houndfish hunt near the surface with long jaws filled with fine teeth. powerful leaps can carry their narrow bodies far above the water.,inactive +6603,tropical flyingfish,Surface ocean fish,Salt Water,ocean,Day,Forbidden,Any,Rare,0.35,0.05,1.5,10,22,0.94,,,,tropical flyingfish accelerate underwater before spreading enlarged fins above the surface. glides help them escape pursuing predators.,inactive +6701,striped bass,Temperate coastal,Salt Water,ocean,Any,Any,Any,Uncommon,4,1.5,8,7,7,0.9,,,,"striped bass split their lives between salt and fresh water, returning upriver to spawn. a long-lived striper may see three decades.",active +6801,atlantic croaker,Temperate estuary,Salt Water,ocean,Night,Required,Any,Common,2.1,0.1,5,3,8,0.92,,,,atlantic croakers vibrate muscles against the swim bladder to make a croaking sound. chin barbels locate worms in sandy bays.,inactive +6802,black drum,Temperate estuary,Salt Water,ocean,Night,Any,Any,Uncommon,0.7,1,70,8,27,0.82,,,,black drum crush oysters and crabs with rounded throat teeth. large adults develop dark vertical bars that fade with age.,inactive +6803,red drum,Temperate estuary,Salt Water,ocean,Any,Required,Any,Uncommon,0.75,1,45,8,23,0.84,,,,red drum use powerful tails to patrol surf and estuaries. one or more black spots near the tail may confuse predators about which end is the head.,inactive +6804,striped mullet,Temperate estuary,Fresh Water | Salt Water,ocean,Day,Any,Any,Common,2.5,0.3,8,3,8,0.92,,,,striped mullet leap clear of the water and travel in coastal schools. they graze algae and detritus with specialized digestive systems.,inactive +6805,weakfish,Temperate estuary,Salt Water,ocean,Night,Any,Required,Rare,0.32,0.5,18,12,29,0.86,,,,weakfish are named for delicate mouth tissue that tears easily around a hook. iridescent spots scatter across their bronze backs.,inactive +6806,white perch,Temperate estuary,Fresh Water | Salt Water,river,Any,Any,Any,Uncommon,1.1,0.2,3.5,5,11,0.9,,,,white perch tolerate fresh and brackish water along the atlantic coast. deep silver bodies gather in schools around river mouths.,inactive +6807,yellowfin croaker,Temperate estuary,Salt Water,ocean,Any,Any,Any,Common,2,0.1,4,3,8,0.92,,,,yellowfin croakers search sandy surf zones with a small chin barbel. internal muscles produce croaks and drumming calls.,inactive +6901,black rockfish,Temperate reef fish,Salt Water,ocean,Any,Any,Any,Common,1.7,0.3,10,4,11,0.9,,,,"black rockfish gather above reefs and kelp along the north pacific coast. like other rockfish, they give birth to live young.",inactive +6902,black sea bass,Temperate reef fish,Salt Water,ocean,Day,Any,Any,Common,1.7,0.3,8,4,10,0.9,,,,"black sea bass shelter around reefs, piers, and wrecks. many begin life as female and later become male.",inactive +6903,canary rockfish,Temperate reef fish,Salt Water,ocean,Day,Any,Any,Uncommon,0.7,0.5,12,7,17,0.88,,,,canary rockfish glow orange-yellow over deep pacific reefs. these long-lived fish mature slowly and give birth to live young.,inactive +6904,scup,Temperate reef fish,Salt Water,ocean,Day,Any,Any,Common,2.2,0.1,5,3,8,0.92,,,,"scup use small strong teeth to crush shellfish and other bottom prey. deep silver bodies gather around piers, reefs, and eelgrass.",inactive +6905,sheepshead,Temperate reef fish,Salt Water,ocean,Day,Any,Any,Uncommon,0.75,0.5,20,7,18,0.86,,,,sheepshead carry flat human-like front teeth for biting barnacles and crabs. dark bars cross their high silver bodies.,inactive +6906,tautog,Temperate reef fish,Salt Water,ocean,Day,Any,Any,Uncommon,0.8,0.5,20,7,18,0.86,,,,tautog pry mussels and crabs from rocky structure with thick lips and strong teeth. adults return to familiar shelters year after year.,inactive +6907,yelloweye rockfish,Temperate reef fish,Salt Water,ocean,Any,Any,Required,Epic,0.09,2,35,28,64,0.84,,,,yelloweye rockfish can live for more than a century on deep pacific reefs. bright golden eyes stand out against orange-red bodies.,inactive +7001,lingcod,Temperate reef predators,Salt Water,ocean,Any,Any,Any,Rare,0.25,2,60,14,38,0.83,,,,"lingcod guard rocky dens and ambush fish with a huge tooth-lined mouth. despite the name, they are greenling relatives rather than cod.",inactive +7101,milkfish,Tropical coastal fish,Salt Water,ocean,Day,Any,Any,Common,1.8,0.5,25,4,12,0.88,,,,milkfish graze algae and tiny organisms in warm coastal shallows. deeply forked tails drive large schools through lagoons and estuaries.,inactive +7201,roosterfish,Tropical coastal predators,Salt Water,ocean,Day,Any,Any,Epic,0.11,5,100,30,70,0.82,,,,roosterfish raise seven long dorsal spines while chasing prey through tropical surf. dark bands cross their sleek silver bodies.,inactive +7301,atlantic tarpon,Tropical estuary,Fresh Water | Salt Water,ocean,Any,Required,Any,Epic,0.09,10,180,34,82,0.8,,,,atlantic tarpon gulp air with a lung-like swim bladder when coastal water runs low on oxygen. giant silver scales flash during leaps.,inactive +7302,barramundi,Tropical estuary,Fresh Water | Salt Water,river,Night,Required,Any,Rare,0.24,2,45,15,38,0.84,,,,barramundi move between rivers and coasts and can breathe in low-oxygen water. many mature first as males and later become females.,inactive +7303,common snook,Tropical estuary,Salt Water,ocean,Night,Required,Any,Rare,0.3,1,30,13,32,0.85,,,,common snook wait around mangrove roots and current seams to ambush prey. a bold black lateral line divides their silver flanks.,inactive +7401,bonefish,Tropical flats fish,Salt Water,ocean,Day,Any,Forbidden,Rare,0.25,0.5,15,13,31,0.86,,,,bonefish sweep tropical flats in silvery schools and root for buried prey. their speed and pale bodies make them difficult to follow in shallow water.,inactive +7402,Florida pompano,Tropical flats fish,Salt Water,ocean,Day,Any,Forbidden,Uncommon,0.85,0.5,9,7,16,0.88,,,,"florida pompano search warm surf for crabs, clams, and sand fleas. short blunt snouts lead into deep, silvery bodies.",inactive +7403,ladyfish,Tropical flats fish,Salt Water,ocean,Day,Required,Any,Common,1.7,0.2,8,4,10,0.9,,,,ladyfish race through warm shallows after schooling prey and often leap when pursued. a deeply forked tail powers their slender bodies.,inactive +7404,permit,Tropical flats fish,Salt Water,ocean,Day,Forbidden,Any,Epic,0.11,3,50,27,62,0.84,,,,permit browse tropical flats for crabs and shellfish with rubbery mouths. tall silver bodies carry long sickle-shaped dorsal and anal fins.,inactive +7501,clown knifefish,Tropical freshwater fish,Fresh Water,river,Night,Any,Required,Rare,0.25,1,25,16,38,0.86,,,,clown knifefish undulate one long belly fin to glide forward or backward. dark eye-like spots line their silver nocturnal bodies.,inactive +7502,clown loach,Tropical freshwater fish,Fresh Water,river,Day,Required,Any,Rare,0.32,0.1,2,10,22,0.9,,,,clown loaches rest in groups and make clicking sounds while feeding. orange bodies carry three broad black bands and small eye spines.,inactive +7503,discus,Tropical freshwater fish,Fresh Water,river,Day,Any,Required,Epic,0.12,0.1,1,24,52,0.92,,,,"discus move through quiet amazon backwaters with round, flattened bodies. parents feed newly hatched young with nutrient-rich skin mucus.",inactive +7504,freshwater angelfish,Tropical freshwater fish,Fresh Water,river,Day,Any,Any,Rare,0.3,0.05,0.5,10,22,0.95,,,,freshwater angelfish slip between tall plants on narrow triangular bodies. long fins and vertical bars resemble stems and shadows.,inactive +7505,giant gourami,Tropical freshwater fish,Fresh Water,lake,Day,Any,Any,Rare,0.25,2,20,13,31,0.86,,,,giant gouramis breathe surface air through a specialized labyrinth organ. adults graze plants but also investigate insects and small animals.,inactive +7506,Nile tilapia,Tropical freshwater fish,Fresh Water,lake,Day,Any,Any,Common,2.2,0.3,8,3,9,0.9,,,,nile tilapia thrive in warm lakes and rivers on a varied diet. females protect eggs and young inside their mouths.,inactive +7507,oscar,Tropical freshwater fish,Fresh Water,river,Day,Any,Any,Uncommon,0.8,0.3,4,6,14,0.9,,,,oscars are large south american cichlids that recognize routines and defend territories. a tail eyespot may redirect attacks away from the head.,inactive +7508,Siamese fighting fish,Tropical freshwater fish,Fresh Water,pond,Day,Required,Any,Uncommon,1,0.01,0.15,5,10,1,,,,siamese fighting fish breathe surface air with a labyrinth organ. males build bubble nests and guard the eggs beneath them.,inactive +7509,tambaqui,Tropical freshwater fish,Fresh Water,river,Day,Required,Any,Epic,0.1,8,80,30,68,0.82,,,,tambaqui follow seasonal floods into forests to feed on fruit and seeds. strong square teeth crack tough plant material.,inactive +7510,walking catfish,Tropical freshwater fish,Fresh Water,pond,Night,Required,Any,Rare,0.3,0.5,5,11,24,0.9,,,,walking catfish wriggle across wet ground using stiff pectoral spines for support. an air-breathing organ helps them survive the journey.,inactive +7601,giant snakehead,Tropical freshwater predators,Fresh Water,river,Night,Any,Required,Epic,0.1,3,45,28,64,0.84,,,,giant snakeheads breathe air and guard schools of young near the surface. long bodies launch sudden attacks from flooded vegetation.,inactive +7602,golden dorado,Tropical freshwater predators,Fresh Water,river,Day,Required,Any,Epic,0.1,5,55,29,66,0.82,,,,"golden dorado chase fish through powerful south american rivers. muscular tails, heavy jaws, and golden scales suit life in fast current.",inactive +7603,golden mahseer,Tropical freshwater predators,Fresh Water,river,Day,Required,Any,Epic,0.09,8,90,32,72,0.82,,,,golden mahseer migrate through swift mountain rivers to reach spawning grounds. large scales shine bronze beneath reddish fins.,inactive +7604,peacock bass,Tropical freshwater predators,Fresh Water,river,Day,Any,Any,Rare,0.25,1,25,15,36,0.84,,,,peacock bass are aggressive south american cichlids rather than true bass. adults guard nests and hunt fish in warm clear water.,inactive +7605,red-bellied piranha,Tropical freshwater predators,Fresh Water,river,Any,Required,Any,Rare,0.3,0.2,4,12,27,0.9,,,,"red-bellied piranhas communicate with barks and drum-like sounds. schools provide protection as they search for fish, insects, and carrion.",inactive +7606,silver arowana,Tropical freshwater predators,Fresh Water,river,Day,Any,Required,Epic,0.11,1,15,25,56,0.86,,,,silver arowanas patrol the surface with upturned mouths and long bodies. powerful jumps capture insects and small animals above the water.,inactive +7701,blue whale,Whales and dolphins,Salt Water,ocean,Day,Any,Forbidden,Legendary,0.005,100000,330000,120,300,0.72,,,,blue whales are the largest animals known to have lived. pleated throats expand around vast mouthfuls of water that baleen filters for krill.,inactive +7702,common bottlenose dolphin,Whales and dolphins,Salt Water,ocean,Day,Any,Forbidden,Legendary,0.012,330,1400,75,180,0.76,,,,"common bottlenose dolphins coordinate with whistles, clicks, and body signals. echolocation reveals prey hidden in dark or cloudy water.",inactive +7703,humpback whale,Whales and dolphins,Salt Water,ocean,Day,Any,Required,Legendary,0.008,40000,90000,105,260,0.73,,,,humpback whales use long pectoral fins while turning and feeding. males produce layered songs that change across breeding seasons.,inactive +7704,killer whale,Whales and dolphins,Salt Water,ocean,Day,Required,Any,Legendary,0.008,3000,12000,95,230,0.74,,,,killer whales live in close family groups with distinct calls and hunting traditions. different populations specialize in different prey.,inactive +7705,sperm whale,Whales and dolphins,Salt Water,ocean,Night,Any,Required,Legendary,0.006,15000,125000,115,280,0.72,,,,sperm whales make deep dives to hunt squid with powerful echolocation clicks. their enormous square heads contain a waxy spermaceti organ.,inactive diff --git a/docs/design/fish_catalog_proposal_final.csv b/docs/design/fish_catalog_proposal_final.csv new file mode 100644 index 0000000..e0b402f --- /dev/null +++ b/docs/design/fish_catalog_proposal_final.csv @@ -0,0 +1,314 @@ +catalog_number,id,implementation_status,active_status,art_status,fish_resource_path,display_texture_path,catch_profile_id +101,bowfin,implemented,inactive,missing icon,res://fish/species/bowfin/bowfin.tres,,common +102,sturgeon_lake,implemented,inactive,missing icon,res://fish/species/sturgeon_lake/sturgeon_lake.tres,,common +103,gar_longnose,implemented,inactive,missing icon,res://fish/species/gar_longnose/gar_longnose.tres,,common +104,paddlefish,implemented,inactive,missing icon,res://fish/species/paddlefish/paddlefish.tres,,common +105,sturgeon_shovelnose,implemented,inactive,missing icon,res://fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres,,common +106,gar_spotted,implemented,inactive,missing icon,res://fish/species/gar_spotted/gar_spotted.tres,,common +107,lungfish_west_african,implemented,inactive,missing icon,res://fish/species/lungfish_west_african/lungfish_west_african.tres,,common +201,mudskipper_atlantic,implemented,inactive,missing icon,res://fish/species/mudskipper_atlantic/mudskipper_atlantic.tres,,common +202,foureyes_largescale,implemented,inactive,missing icon,res://fish/species/foureyes_largescale/foureyes_largescale.tres,,common +301,mullet_red,implemented,inactive,missing icon,res://fish/species/mullet_red/mullet_red.tres,,common +401,plaice_european,implemented,inactive,missing icon,res://fish/species/plaice_european/plaice_european.tres,,common +402,flounder_summer,implemented,inactive,missing icon,res://fish/species/flounder_summer/flounder_summer.tres,,common +403,flounder_winter,implemented,inactive,missing icon,res://fish/species/flounder_winter/flounder_winter.tres,,common +501,dugong,implemented,inactive,missing icon,res://fish/species/dugong/dugong.tres,,common +502,seal_harbor,implemented,inactive,missing icon,res://fish/species/seal_harbor/seal_harbor.tres,,common +503,sea_otter,implemented,inactive,missing icon,res://fish/species/sea_otter/sea_otter.tres,,common +504,walrus,implemented,inactive,missing icon,res://fish/species/walrus/walrus.tres,,common +505,manatee_west_indian,implemented,inactive,missing icon,res://fish/species/manatee_west_indian/manatee_west_indian.tres,,common +601,pipefish_bay,implemented,inactive,missing icon,res://fish/species/pipefish_bay/pipefish_bay.tres,,common +602,seahorse_lined,implemented,inactive,missing icon,res://fish/species/seahorse_lined/seahorse_lined.tres,,common +603,monkfish,implemented,inactive,missing icon,res://fish/species/monkfish/monkfish.tres,,common +604,tripletail,implemented,inactive,missing icon,res://fish/species/tripletail/tripletail.tres,,common +701,mackerel_atlantic,implemented,active,complete,res://fish/species/mackerel_atlantic/mackerel_atlantic.tres,res://fish/species/mackerel_atlantic/fish_mackerel_atlantic.png,common +702,bluefish,implemented,inactive,missing icon,res://fish/species/bluefish/bluefish.tres,,common +703,mackerel_cero,implemented,active,complete,res://fish/species/mackerel_cero/mackerel_cero.tres,res://fish/species/mackerel_cero/fish_mackerel_cero.png,common +704,mackerel_chub,implemented,active,complete,res://fish/species/mackerel_chub/mackerel_chub.tres,res://fish/species/mackerel_chub/fish_mackerel_chub.png,common +705,jack_crevalle,implemented,inactive,missing icon,res://fish/species/jack_crevalle/jack_crevalle.tres,,common +706,mackerel_king,implemented,active,complete,res://fish/species/mackerel_king/mackerel_king.tres,res://fish/species/mackerel_king/fish_mackerel_king.png,common +707,mackerel_spanish,implemented,active,complete,res://fish/species/mackerel_spanish/mackerel_spanish.tres,res://fish/species/mackerel_spanish/fish_mackerel_spanish.png,common +708,queenfish_talang,implemented,inactive,missing icon,res://fish/species/queenfish_talang/queenfish_talang.tres,,common +801,sand_lance_american,implemented,inactive,missing icon,res://fish/species/sand_lance_american/sand_lance_american.tres,,common +802,menhaden_atlantic,implemented,inactive,missing icon,res://fish/species/menhaden_atlantic/menhaden_atlantic.tres,,common +803,pomfret_black,implemented,active,complete,res://fish/species/pomfret_black/pomfret_black.tres,res://fish/species/pomfret_black/fish_pomfret_black.png,common +804,pomfret_chinese,implemented,active,complete,res://fish/species/pomfret_chinese/pomfret_chinese.tres,res://fish/species/pomfret_chinese/fish_pomfret_chinese.png,common +805,anchovy_european,implemented,active,complete,res://fish/species/anchovy_european/anchovy_european.tres,res://fish/species/anchovy_european/fish_anchovy_european.png,common +806,sardine_european,implemented,inactive,missing icon,res://fish/species/sardine_european/sardine_european.tres,,common +807,pomfret_golden,implemented,active,complete,res://fish/species/pomfret_golden/pomfret_golden.tres,res://fish/species/pomfret_golden/fish_pomfret_golden.png,common +808,anchovy_northern,implemented,active,complete,res://fish/species/anchovy_northern/anchovy_northern.tres,res://fish/species/anchovy_northern/fish_anchovy_northern.png,common +809,sardine_pacific,implemented,inactive,missing icon,res://fish/species/sardine_pacific/sardine_pacific.tres,,common +810,pomfret_white,implemented,active,complete,res://fish/species/pomfret_white/pomfret_white.tres,res://fish/species/pomfret_white/fish_pomfret_white.png,common +901,shark_blacktip,implemented,inactive,missing icon,res://fish/species/shark_blacktip/shark_blacktip.tres,,common +902,shark_great_hammerhead,implemented,inactive,missing icon,res://fish/species/shark_great_hammerhead/shark_great_hammerhead.tres,,common +903,shark_great_white,implemented,inactive,missing icon,res://fish/species/shark_great_white/shark_great_white.tres,,common +904,shark_tiger,implemented,inactive,missing icon,res://fish/species/shark_tiger/shark_tiger.tres,,common +905,shark_whale,implemented,inactive,missing icon,res://fish/species/shark_whale/shark_whale.tres,,common +1001,burbot,implemented,inactive,missing icon,res://fish/species/burbot/burbot.tres,,common +1002,cisco,implemented,inactive,missing icon,res://fish/species/cisco/cisco.tres,,common +1003,whitefish_lake,implemented,inactive,missing icon,res://fish/species/whitefish_lake/whitefish_lake.tres,,common +1101,char_arctic,implemented,inactive,missing icon,res://fish/species/char_arctic/char_arctic.tres,,common +1102,grayling_arctic,implemented,inactive,missing icon,res://fish/species/grayling_arctic/grayling_arctic.tres,,common +1103,trout_brown,implemented,inactive,missing icon,res://fish/species/trout_brown/trout_brown.tres,,common +1104,trout_cutthroat,implemented,active,complete,res://fish/species/trout_cutthroat/trout_cutthroat.tres,res://fish/species/trout_cutthroat/fish_trout_cutthroat.png,common +1105,trout_golden,implemented,active,complete,res://fish/species/trout_golden/trout_golden.tres,res://fish/species/trout_golden/fish_trout_golden.png,common +1106,trout_rainbow,implemented,active,complete,res://fish/species/trout_rainbow/trout_rainbow.tres,res://fish/species/trout_rainbow/fish_trout_rainbow.png,common +1201,wolffish_atlantic,implemented,inactive,missing icon,res://fish/species/wolffish_atlantic/wolffish_atlantic.tres,,common +1202,cusk,implemented,inactive,missing icon,res://fish/species/cusk/cusk.tres,,common +1203,wolffish_spotted,implemented,inactive,missing icon,res://fish/species/wolffish_spotted/wolffish_spotted.tres,,common +1301,herring_atlantic,implemented,inactive,missing icon,res://fish/species/herring_atlantic/herring_atlantic.tres,,common +1302,capelin,implemented,inactive,missing icon,res://fish/species/capelin/capelin.tres,,common +1303,sprat_european,implemented,inactive,missing icon,res://fish/species/sprat_european/sprat_european.tres,,common +1304,herring_pacific,implemented,inactive,missing icon,res://fish/species/herring_pacific/herring_pacific.tres,,common +1401,pollock_alaska,implemented,inactive,missing icon,res://fish/species/pollock_alaska/pollock_alaska.tres,,common +1402,cod_atlantic,implemented,inactive,missing icon,res://fish/species/cod_atlantic/cod_atlantic.tres,,common +1403,pollock_atlantic,implemented,inactive,missing icon,res://fish/species/pollock_atlantic/pollock_atlantic.tres,,common +1404,sole_dover,implemented,inactive,missing icon,res://fish/species/sole_dover/sole_dover.tres,,common +1405,haddock,implemented,inactive,missing icon,res://fish/species/haddock/haddock.tres,,common +1406,cod_pacific,implemented,inactive,missing icon,res://fish/species/cod_pacific/cod_pacific.tres,,common +1407,hake_pacific,implemented,inactive,missing icon,res://fish/species/hake_pacific/hake_pacific.tres,,common +1408,hake_silver,implemented,inactive,missing icon,res://fish/species/hake_silver/hake_silver.tres,,common +1501,nautilus_chambered,implemented,inactive,missing icon,res://fish/species/nautilus_chambered/nautilus_chambered.tres,,common +1502,cuttlefish_common,implemented,inactive,missing icon,res://fish/species/cuttlefish_common/cuttlefish_common.tres,,common +1503,cuttlefish_flamboyant,implemented,inactive,missing icon,res://fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres,,common +1601,tilefish_blueline,implemented,inactive,missing icon,res://fish/species/tilefish_blueline/tilefish_blueline.tres,,common +1602,tilefish_golden,implemented,inactive,missing icon,res://fish/species/tilefish_golden/tilefish_golden.tres,,common +1603,ocean_perch_pacific,implemented,inactive,missing icon,res://fish/species/ocean_perch_pacific/ocean_perch_pacific.tres,,common +1604,sea_bass_chilean,implemented,inactive,missing icon,res://fish/species/sea_bass_chilean/sea_bass_chilean.tres,,common +1605,sablefish,implemented,inactive,missing icon,res://fish/species/sablefish/sablefish.tres,,common +1606,wreckfish,implemented,inactive,missing icon,res://fish/species/wreckfish/wreckfish.tres,,common +1701,oarfish_giant,implemented,inactive,missing icon,res://fish/species/oarfish_giant/oarfish_giant.tres,,common +1702,coelacanth_west_indian,implemented,inactive,missing icon,res://fish/species/coelacanth_west_indian/coelacanth_west_indian.tres,,common +1801,anglerfish_black_seadevil,implemented,inactive,missing icon,res://fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres,,common +1802,fangtooth_common,implemented,inactive,missing icon,res://fish/species/fangtooth_common/fangtooth_common.tres,,common +1803,gulper_eel,implemented,inactive,missing icon,res://fish/species/gulper_eel/gulper_eel.tres,,common +1804,barreleye_pacific,implemented,inactive,missing icon,res://fish/species/barreleye_pacific/barreleye_pacific.tres,,common +1805,blobfish_smooth_head,implemented,inactive,missing icon,res://fish/species/blobfish_smooth_head/blobfish_smooth_head.tres,,common +1806,lanternfish_spotted,implemented,inactive,missing icon,res://fish/species/lanternfish_spotted/lanternfish_spotted.tres,,common +1901,sea_star_crown_of_thorns,implemented,inactive,missing icon,res://fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres,,common +1902,sea_cucumber_giant_california,implemented,inactive,missing icon,res://fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres,,common +1903,urchin_purple,implemented,inactive,missing icon,res://fish/species/urchin_purple/urchin_purple.tres,,common +1904,sand_dollar,implemented,inactive,missing icon,res://fish/species/sand_dollar/sand_dollar.tres,,common +1905,sea_star_sunflower,implemented,inactive,missing icon,res://fish/species/sea_star_sunflower/sea_star_sunflower.tres,,common +2001,axolotl,implemented,inactive,missing icon,res://fish/species/axolotl/axolotl.tres,,common +2002,hellbender,implemented,inactive,missing icon,res://fish/species/hellbender/hellbender.tres,,common +2101,guppy,implemented,inactive,missing icon,res://fish/species/guppy/guppy.tres,,common +2102,tetra_neon,implemented,inactive,missing icon,res://fish/species/tetra_neon/tetra_neon.tres,,common +2103,danio_zebra,implemented,inactive,missing icon,res://fish/species/danio_zebra/danio_zebra.tres,,common +2201,largemouth_bass,implemented,inactive,missing icon,res://fish/species/largemouth_bass/largemouth_bass.tres,,common +2202,smallmouth_bass,implemented,inactive,missing icon,res://fish/species/smallmouth_bass/smallmouth_bass.tres,,common +2301,buffalo_bigmouth,implemented,inactive,missing icon,res://fish/species/buffalo_bigmouth/buffalo_bigmouth.tres,,common +2302,redhorse_golden,implemented,inactive,missing icon,res://fish/species/redhorse_golden/redhorse_golden.tres,,common +2303,quillback,implemented,inactive,missing icon,res://fish/species/quillback/quillback.tres,,common +2304,buffalo_smallmouth,implemented,inactive,missing icon,res://fish/species/buffalo_smallmouth/buffalo_smallmouth.tres,,common +2305,sucker_white,implemented,inactive,missing icon,res://fish/species/sucker_white/sucker_white.tres,,common +2401,bullhead_black,implemented,inactive,missing icon,res://fish/species/bullhead_black/bullhead_black.tres,,common +2402,catfish_blue,implemented,active,complete,res://fish/species/catfish_blue/catfish_blue.tres,res://fish/species/catfish_blue/fish_catfish_blue.png,bass +2403,bullhead_brown,implemented,inactive,missing icon,res://fish/species/bullhead_brown/bullhead_brown.tres,,common +2404,catfish_channel,implemented,active,complete,res://fish/species/catfish_channel/catfish_channel.tres,res://fish/species/catfish_channel/fish_catfish_channel.png,common +2405,catfish_flathead,implemented,active,complete,res://fish/species/catfish_flathead/catfish_flathead.tres,res://fish/species/catfish_flathead/fish_catfish_flathead.png,bass +2406,madtom_tadpole,implemented,inactive,missing icon,res://fish/species/madtom_tadpole/madtom_tadpole.tres,,common +2407,catfish_white,implemented,active,complete,res://fish/species/catfish_white/catfish_white.tres,res://fish/species/catfish_white/fish_catfish_white.png,common +2408,bullhead_yellow,implemented,inactive,missing icon,res://fish/species/bullhead_yellow/bullhead_yellow.tres,,common +2501,barbel_common,implemented,inactive,missing icon,res://fish/species/barbel_common/barbel_common.tres,,common +2502,bream_common,implemented,inactive,missing icon,res://fish/species/bream_common/bream_common.tres,,common +2503,carp,implemented,active,complete,res://fish/species/carp/carp.tres,res://fish/species/carp/fish_carp_common.png,carp +2504,roach_common,implemented,inactive,missing icon,res://fish/species/roach_common/roach_common.tres,,common +2505,chub_european,implemented,active,complete,res://fish/species/chub_european/chub_european.tres,res://fish/species/chub_european/fish_chub_european.png,common +2506,fallfish,implemented,inactive,missing icon,res://fish/species/fallfish/fallfish.tres,,common +2507,ide,implemented,inactive,missing icon,res://fish/species/ide/ide.tres,,common +2508,rudd,implemented,inactive,missing icon,res://fish/species/rudd/rudd.tres,,common +2509,tench,implemented,inactive,missing icon,res://fish/species/tench/tench.tres,,common +2601,crayfish_red_swamp,implemented,inactive,missing icon,res://fish/species/crayfish_red_swamp/crayfish_red_swamp.tres,,common +2701,gar_alligator,implemented,inactive,missing icon,res://fish/species/gar_alligator/gar_alligator.tres,,common +2702,arapaima,implemented,inactive,missing icon,res://fish/species/arapaima/arapaima.tres,,common +2703,tigerfish_goliath,implemented,inactive,missing icon,res://fish/species/tigerfish_goliath/tigerfish_goliath.tres,,common +2704,muskellunge,implemented,inactive,missing icon,res://fish/species/muskellunge/muskellunge.tres,,common +2801,shiner_common,implemented,inactive,missing icon,res://fish/species/shiner_common/shiner_common.tres,,common +2802,chub_creek,implemented,inactive,missing icon,res://fish/species/chub_creek/chub_creek.tres,,common +2803,shiner_emerald,implemented,inactive,missing icon,res://fish/species/shiner_emerald/shiner_emerald.tres,,common +2804,minnow_fathead,implemented,inactive,missing icon,res://fish/species/minnow_fathead/minnow_fathead.tres,,common +2805,chub_flame,implemented,active,complete,res://fish/species/chub_flame/chub_flame.tres,res://fish/species/chub_flame/fish_chub_flame.png,common +2806,shiner_golden,implemented,inactive,missing icon,res://fish/species/shiner_golden/shiner_golden.tres,,common +2807,chub_lake,implemented,active,complete,res://fish/species/chub_lake/chub_lake.tres,res://fish/species/chub_lake/fish_chub_lake.png,common +2901,electric_eel,implemented,inactive,missing icon,res://fish/species/electric_eel/electric_eel.tres,,common +2902,freshwater_drum,implemented,inactive,missing icon,res://fish/species/freshwater_drum/freshwater_drum.tres,,common +2903,goldeye,implemented,inactive,missing icon,res://fish/species/goldeye/goldeye.tres,,common +2904,mooneye,implemented,inactive,missing icon,res://fish/species/mooneye/mooneye.tres,,common +2905,loach_weather,implemented,inactive,missing icon,res://fish/species/loach_weather/loach_weather.tres,,common +3001,goldfish_bubbleeye,implemented,active,complete,res://fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres,res://fish/species/goldfish_bubbleeye/fish_goldfish_bubbleeye.png,common +3002,goldfish,implemented,active,complete,res://fish/species/goldfish/goldfish.tres,res://fish/species/goldfish/fish_goldfish.png,common +3003,koi,implemented,inactive,missing icon,res://fish/species/koi/koi.tres,,common +3101,crappie_black,implemented,inactive,missing icon,res://fish/species/crappie_black/crappie_black.tres,,common +3102,bluegill,implemented,active,complete,res://fish/species/bluegill/bluegill.tres,res://fish/species/bluegill/fish_bluegill.png,common +3103,green_sunfish,implemented,inactive,missing icon,res://fish/species/green_sunfish/green_sunfish.tres,,common +3104,pumpkinseed,implemented,inactive,missing icon,res://fish/species/pumpkinseed/pumpkinseed.tres,,common +3105,redear_sunfish,implemented,inactive,missing icon,res://fish/species/redear_sunfish/redear_sunfish.tres,,common +3106,warmouth,implemented,inactive,missing icon,res://fish/species/warmouth/warmouth.tres,,common +3107,crappie_white,implemented,inactive,missing icon,res://fish/species/crappie_white/crappie_white.tres,,common +3201,yellow_perch,implemented,inactive,missing icon,res://fish/species/yellow_perch/yellow_perch.tres,,common +3301,pickerel_chain,implemented,inactive,missing icon,res://fish/species/pickerel_chain/pickerel_chain.tres,,common +3302,pickerel_grass,implemented,inactive,missing icon,res://fish/species/pickerel_grass/pickerel_grass.tres,,common +3303,pike_northern,implemented,inactive,missing icon,res://fish/species/pike_northern/pike_northern.tres,,common +3304,sauger,implemented,active,complete,res://fish/species/sauger/sauger.tres,res://fish/species/sauger/fish_sauger.png,common +3305,saugeye,implemented,active,complete,res://fish/species/saugeye/saugeye.tres,res://fish/species/saugeye/fish_saugeye.png,common +3306,walleye,implemented,active,complete,res://fish/species/walleye/walleye.tres,res://fish/species/walleye/fish_walleye.png,common +3401,goby_round,implemented,active,complete,res://fish/species/goby_round/goby_round.tres,res://fish/species/goby_round/fish_goby_round.png,common +3501,jelly_crystal,implemented,inactive,missing icon,res://fish/species/jelly_crystal/jelly_crystal.tres,,common +3502,jelly_lions_mane,implemented,inactive,missing icon,res://fish/species/jelly_lions_mane/jelly_lions_mane.tres,,common +3503,jelly_moon,implemented,inactive,missing icon,res://fish/species/jelly_moon/jelly_moon.tres,,common +3504,jelly_pacific_sea_nettle,implemented,inactive,missing icon,res://fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres,,common +3505,jelly_sea_wasp,implemented,inactive,missing icon,res://fish/species/jelly_sea_wasp/jelly_sea_wasp.tres,,common +3601,pompano_african,implemented,inactive,missing icon,res://fish/species/pompano_african/pompano_african.tres,,common +3602,cobia,implemented,inactive,missing icon,res://fish/species/cobia/cobia.tres,,common +3603,trevally_giant,implemented,inactive,missing icon,res://fish/species/trevally_giant/trevally_giant.tres,,common +3604,amberjack_greater,implemented,inactive,missing icon,res://fish/species/amberjack_greater/amberjack_greater.tres,,common +3605,amberjack_lesser,implemented,inactive,missing icon,res://fish/species/amberjack_lesser/amberjack_lesser.tres,,common +3701,halibut_atlantic,implemented,inactive,missing icon,res://fish/species/halibut_atlantic/halibut_atlantic.tres,,common +3702,halibut_pacific,implemented,inactive,missing icon,res://fish/species/halibut_pacific/halibut_pacific.tres,,common +3703,turbot,implemented,inactive,missing icon,res://fish/species/turbot/turbot.tres,,common +3801,lobster_american,implemented,inactive,missing icon,res://fish/species/lobster_american/lobster_american.tres,,common +3802,krill_antarctic,implemented,inactive,missing icon,res://fish/species/krill_antarctic/krill_antarctic.tres,,common +3803,lobster_caribbean_spiny,implemented,inactive,missing icon,res://fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres,,common +3804,shrimp_peacock_mantis,implemented,inactive,missing icon,res://fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres,,common +3805,shrimp_skunk_cleaner,implemented,inactive,missing icon,res://fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres,,common +3901,crab_ghost,implemented,inactive,missing icon,res://fish/species/crab_ghost/crab_ghost.tres,,common +3902,crab_blue,implemented,inactive,missing icon,res://fish/species/crab_blue/crab_blue.tres,,common +3903,crab_dungeness,implemented,inactive,missing icon,res://fish/species/crab_dungeness/crab_dungeness.tres,,common +3904,crab_japanese_spider,implemented,inactive,missing icon,res://fish/species/crab_japanese_spider/crab_japanese_spider.tres,,common +3905,crab_red_king,implemented,inactive,missing icon,res://fish/species/crab_red_king/crab_red_king.tres,,common +4001,eel_american,implemented,inactive,missing icon,res://fish/species/eel_american/eel_american.tres,,common +4002,eel_european,implemented,inactive,missing icon,res://fish/species/eel_european/eel_european.tres,,common +4101,smelt_rainbow,implemented,inactive,missing icon,res://fish/species/smelt_rainbow/smelt_rainbow.tres,,common +4201,smelt_eulachon,implemented,inactive,missing icon,res://fish/species/smelt_eulachon/smelt_eulachon.tres,,common +4301,sturgeon_white,implemented,inactive,missing icon,res://fish/species/sturgeon_white/sturgeon_white.tres,,common +4401,salmon_atlantic,implemented,active,complete,res://fish/species/salmon_atlantic/salmon_atlantic.tres,res://fish/species/salmon_atlantic/fish_salmon_atlantic.png,bass +4402,salmon_chum,implemented,active,complete,res://fish/species/salmon_chum/salmon_chum.tres,res://fish/species/salmon_chum/fish_salmon_chum.png,bass +4403,salmon_coho,implemented,active,complete,res://fish/species/salmon_coho/salmon_coho.tres,res://fish/species/salmon_coho/fish_salmon_coho.png,bass +4404,salmon_pink,implemented,active,complete,res://fish/species/salmon_pink/salmon_pink.tres,res://fish/species/salmon_pink/fish_salmon_pink.png,bass +4405,salmon_sockeye,implemented,active,complete,res://fish/species/salmon_sockeye/salmon_sockeye.tres,res://fish/species/salmon_sockeye/fish_salmon_sockeye.png,bass +4501,trout_steelhead,implemented,active,complete,res://fish/species/trout_steelhead/trout_steelhead.tres,res://fish/species/trout_steelhead/fish_trout_steelhead.png,common +4601,marlin_black,implemented,active,complete,res://fish/species/marlin_black/marlin_black.tres,res://fish/species/marlin_black/fish_marlin_black.png,common +4602,marlin_blue,implemented,active,complete,res://fish/species/marlin_blue/marlin_blue.tres,res://fish/species/marlin_blue/fish_marlin_blue.png,common +4603,sailfish,implemented,active,complete,res://fish/species/sailfish/sailfish.tres,res://fish/species/sailfish/fish_sailfish.png,common +4604,swordfish,implemented,active,complete,res://fish/species/swordfish/swordfish.tres,res://fish/species/swordfish/fish_swordfish.png,common +4605,marlin_white,implemented,active,complete,res://fish/species/marlin_white/marlin_white.tres,res://fish/species/marlin_white/fish_marlin_white.png,common +4701,mahi_mahi,implemented,inactive,missing icon,res://fish/species/mahi_mahi/mahi_mahi.tres,,common +4702,opah,implemented,inactive,missing icon,res://fish/species/opah/opah.tres,,common +4703,wahoo,implemented,inactive,missing icon,res://fish/species/wahoo/wahoo.tres,,common +4801,tuna_albacore,implemented,active,complete,res://fish/species/tuna_albacore/tuna_albacore.tres,res://fish/species/tuna_albacore/fish_tuna_albacore.png,bass +4802,tuna_bigeye,implemented,active,complete,res://fish/species/tuna_bigeye/tuna_bigeye.tres,res://fish/species/tuna_bigeye/fish_tuna_bigeye.png,bass +4803,tuna_bluefin,implemented,active,complete,res://fish/species/tuna_bluefin/tuna_bluefin.tres,res://fish/species/tuna_bluefin/fish_tuna_bluefin.png,bass +4804,tuna_skipjack,implemented,active,complete,res://fish/species/tuna_skipjack/tuna_skipjack.tres,res://fish/species/tuna_skipjack/fish_tuna_skipjack.png,bass +4805,tuna_yellowfin,implemented,active,complete,res://fish/species/tuna_yellowfin/tuna_yellowfin.tres,res://fish/species/tuna_yellowfin/fish_tuna_yellowfin.png,bass +4901,octopus_common,implemented,inactive,missing icon,res://fish/species/octopus_common/octopus_common.tres,,common +4902,octopus_day,implemented,inactive,missing icon,res://fish/species/octopus_day/octopus_day.tres,,common +4903,octopus_giant_pacific,implemented,inactive,missing icon,res://fish/species/octopus_giant_pacific/octopus_giant_pacific.tres,,common +4904,octopus_greater_blue_ringed,implemented,inactive,missing icon,res://fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres,,common +5001,sunfish,implemented,active,complete,res://fish/species/sunfish/sunfish.tres,res://fish/species/sunfish/fish_sunfish.png,common +5101,skate_barndoor,implemented,inactive,missing icon,res://fish/species/skate_barndoor/skate_barndoor.tres,,common +5102,manta_ray_giant,implemented,inactive,missing icon,res://fish/species/manta_ray_giant/manta_ray_giant.tres,,common +5103,sawfish_largetooth,implemented,inactive,missing icon,res://fish/species/sawfish_largetooth/sawfish_largetooth.tres,,common +5104,stingray_ocellate_river,implemented,inactive,missing icon,res://fish/species/stingray_ocellate_river/stingray_ocellate_river.tres,,common +5105,stingray_southern,implemented,inactive,missing icon,res://fish/species/stingray_southern/stingray_southern.tres,,common +5201,lionfish_red,implemented,inactive,missing icon,res://fish/species/lionfish_red/lionfish_red.tres,,common +5202,scorpionfish_red,implemented,inactive,missing icon,res://fish/species/scorpionfish_red/scorpionfish_red.tres,,common +5301,moray_green,implemented,inactive,missing icon,res://fish/species/moray_green/moray_green.tres,,common +5401,flounder_peacock,implemented,inactive,missing icon,res://fish/species/flounder_peacock/flounder_peacock.tres,,common +5501,surgeonfish_blue,implemented,inactive,missing icon,res://fish/species/surgeonfish_blue/surgeonfish_blue.tres,,common +5502,parrotfish_rainbow,implemented,inactive,missing icon,res://fish/species/parrotfish_rainbow/parrotfish_rainbow.tres,,common +5503,parrotfish_stoplight,implemented,inactive,missing icon,res://fish/species/parrotfish_stoplight/parrotfish_stoplight.tres,,common +5504,tang_yellow,implemented,inactive,missing icon,res://fish/species/tang_yellow/tang_yellow.tres,,common +5601,trumpetfish_atlantic,implemented,inactive,missing icon,res://fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres,,common +5602,triggerfish_gray,implemented,inactive,missing icon,res://fish/species/triggerfish_gray/triggerfish_gray.tres,,common +5603,pufferfish_guineafowl,implemented,inactive,missing icon,res://fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres,,common +5604,cowfish_longhorn,implemented,inactive,missing icon,res://fish/species/cowfish_longhorn/cowfish_longhorn.tres,,common +5605,triggerfish_queen,implemented,inactive,missing icon,res://fish/species/triggerfish_queen/triggerfish_queen.tres,,common +5606,cornetfish_red,implemented,inactive,missing icon,res://fish/species/cornetfish_red/cornetfish_red.tres,,common +5607,porcupinefish_spotted,implemented,inactive,missing icon,res://fish/species/porcupinefish_spotted/porcupinefish_spotted.tres,,common +5608,boxfish_yellow,implemented,inactive,missing icon,res://fish/species/boxfish_yellow/boxfish_yellow.tres,,common +5701,butterflyfish_copperband,implemented,inactive,missing icon,res://fish/species/butterflyfish_copperband/butterflyfish_copperband.tres,,common +5702,clownfish_ocellaris,implemented,inactive,missing icon,res://fish/species/clownfish_ocellaris/clownfish_ocellaris.tres,,common +5703,angelfish_queen,implemented,inactive,missing icon,res://fish/species/angelfish_queen/angelfish_queen.tres,,common +5801,grouper_atlantic_goliath,implemented,inactive,missing icon,res://fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres,,common +5802,trevally_bluefin,implemented,inactive,missing icon,res://fish/species/trevally_bluefin/trevally_bluefin.tres,,common +5803,grouper_giant,implemented,inactive,missing icon,res://fish/species/grouper_giant/grouper_giant.tres,,common +5804,barracuda_great,implemented,inactive,missing icon,res://fish/species/barracuda_great/barracuda_great.tres,,common +5805,grouper_gulf,implemented,active,complete,res://fish/species/grouper_gulf/grouper_gulf.tres,res://fish/species/grouper_gulf/fish_grouper_gulf.png,common +5806,grouper_nassau,implemented,inactive,missing icon,res://fish/species/grouper_nassau/grouper_nassau.tres,,common +5807,grouper_red,implemented,active,complete,res://fish/species/grouper_red/grouper_red.tres,res://fish/species/grouper_red/fish_grouper_red.png,common +5901,chromis_blue_green,implemented,inactive,missing icon,res://fish/species/chromis_blue_green/chromis_blue_green.tres,,common +5902,grunt_bluestriped,implemented,inactive,missing icon,res://fish/species/grunt_bluestriped/grunt_bluestriped.tres,,common +5903,grunt_french,implemented,inactive,missing icon,res://fish/species/grunt_french/grunt_french.tres,,common +5904,damselfish_sergeant_major,implemented,inactive,missing icon,res://fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres,,common +6001,snapper_lane,implemented,active,complete,res://fish/species/snapper_lane/snapper_lane.tres,res://fish/species/snapper_lane/fish_snapper_lane.png,common +6002,snapper_mangrove,implemented,active,complete,res://fish/species/snapper_mangrove/snapper_mangrove.tres,res://fish/species/snapper_mangrove/fish_snapper_mangrove.png,common +6003,snapper_mutton,implemented,active,complete,res://fish/species/snapper_mutton/snapper_mutton.tres,res://fish/species/snapper_mutton/fish_snapper_mutton.png,common +6004,snapper_red,implemented,active,complete,res://fish/species/snapper_red/snapper_red.tres,res://fish/species/snapper_red/fish_snapper_red.png,common +6101,wrasse_ballan,implemented,inactive,missing icon,res://fish/species/wrasse_ballan/wrasse_ballan.tres,,common +6102,wrasse_cleaner,implemented,inactive,missing icon,res://fish/species/wrasse_cleaner/wrasse_cleaner.tres,,common +6103,hogfish,implemented,inactive,missing icon,res://fish/species/hogfish/hogfish.tres,,common +6201,turtle_green,implemented,inactive,missing icon,res://fish/species/turtle_green/turtle_green.tres,,common +6202,turtle_hawksbill,implemented,inactive,missing icon,res://fish/species/turtle_hawksbill/turtle_hawksbill.tres,,common +6203,turtle_leatherback,implemented,inactive,missing icon,res://fish/species/turtle_leatherback/turtle_leatherback.tres,,common +6204,turtle_loggerhead,implemented,inactive,missing icon,res://fish/species/turtle_loggerhead/turtle_loggerhead.tres,,common +6301,seadragon_leafy,implemented,inactive,missing icon,res://fish/species/seadragon_leafy/seadragon_leafy.tres,,common +6302,seadragon_weedy,implemented,inactive,missing icon,res://fish/species/seadragon_weedy/seadragon_weedy.tres,,common +6401,oyster_black_lip_pearl,implemented,inactive,missing icon,res://fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres,,common +6402,clam_giant,implemented,inactive,missing icon,res://fish/species/clam_giant/clam_giant.tres,,common +6403,clam_geoduck,implemented,inactive,missing icon,res://fish/species/clam_geoduck/clam_geoduck.tres,,common +6404,conch_queen,implemented,inactive,missing icon,res://fish/species/conch_queen/conch_queen.tres,,common +6405,abalone_red,implemented,inactive,missing icon,res://fish/species/abalone_red/abalone_red.tres,,common +6501,squid_bigfin_reef,implemented,inactive,missing icon,res://fish/species/squid_bigfin_reef/squid_bigfin_reef.tres,,common +6502,squid_colossal,implemented,inactive,missing icon,res://fish/species/squid_colossal/squid_colossal.tres,,common +6503,squid_giant,implemented,inactive,missing icon,res://fish/species/squid_giant/squid_giant.tres,,common +6504,squid_humboldt,implemented,inactive,missing icon,res://fish/species/squid_humboldt/squid_humboldt.tres,,common +6601,halfbeak_ballyhoo,implemented,inactive,missing icon,res://fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres,,common +6602,needlefish_hound,implemented,inactive,missing icon,res://fish/species/needlefish_hound/needlefish_hound.tres,,common +6603,flyingfish_tropical,implemented,inactive,missing icon,res://fish/species/flyingfish_tropical/flyingfish_tropical.tres,,common +6701,bass,implemented,active,complete,res://fish/species/bass/bass.tres,res://fish/species/bass/fish_bass_striped.png,bass +6801,croaker_atlantic,implemented,inactive,missing icon,res://fish/species/croaker_atlantic/croaker_atlantic.tres,,common +6802,black_drum,implemented,inactive,missing icon,res://fish/species/black_drum/black_drum.tres,,common +6803,red_drum,implemented,inactive,missing icon,res://fish/species/red_drum/red_drum.tres,,common +6804,mullet_striped,implemented,inactive,missing icon,res://fish/species/mullet_striped/mullet_striped.tres,,common +6805,weakfish,implemented,inactive,missing icon,res://fish/species/weakfish/weakfish.tres,,common +6806,white_perch,implemented,inactive,missing icon,res://fish/species/white_perch/white_perch.tres,,common +6807,croaker_yellowfin,implemented,inactive,missing icon,res://fish/species/croaker_yellowfin/croaker_yellowfin.tres,,common +6901,rockfish_black,implemented,inactive,missing icon,res://fish/species/rockfish_black/rockfish_black.tres,,common +6902,sea_bass_black,implemented,inactive,missing icon,res://fish/species/sea_bass_black/sea_bass_black.tres,,common +6903,rockfish_canary,implemented,inactive,missing icon,res://fish/species/rockfish_canary/rockfish_canary.tres,,common +6904,porgy_scup,implemented,inactive,missing icon,res://fish/species/porgy_scup/porgy_scup.tres,,common +6905,sheepshead,implemented,inactive,missing icon,res://fish/species/sheepshead/sheepshead.tres,,common +6906,tautog,implemented,inactive,missing icon,res://fish/species/tautog/tautog.tres,,common +6907,rockfish_yelloweye,implemented,inactive,missing icon,res://fish/species/rockfish_yelloweye/rockfish_yelloweye.tres,,common +7001,lingcod,implemented,inactive,missing icon,res://fish/species/lingcod/lingcod.tres,,common +7101,milkfish,implemented,inactive,missing icon,res://fish/species/milkfish/milkfish.tres,,common +7201,roosterfish,implemented,inactive,missing icon,res://fish/species/roosterfish/roosterfish.tres,,common +7301,tarpon_atlantic,implemented,inactive,missing icon,res://fish/species/tarpon_atlantic/tarpon_atlantic.tres,,common +7302,barramundi,implemented,inactive,missing icon,res://fish/species/barramundi/barramundi.tres,,common +7303,snook_common,implemented,inactive,missing icon,res://fish/species/snook_common/snook_common.tres,,common +7401,bonefish,implemented,inactive,missing icon,res://fish/species/bonefish/bonefish.tres,,common +7402,pompano_florida,implemented,inactive,missing icon,res://fish/species/pompano_florida/pompano_florida.tres,,common +7403,ladyfish,implemented,inactive,missing icon,res://fish/species/ladyfish/ladyfish.tres,,common +7404,permit,implemented,inactive,missing icon,res://fish/species/permit/permit.tres,,common +7501,knifefish_clown,implemented,inactive,missing icon,res://fish/species/knifefish_clown/knifefish_clown.tres,,common +7502,loach_clown,implemented,inactive,missing icon,res://fish/species/loach_clown/loach_clown.tres,,common +7503,discus,implemented,inactive,missing icon,res://fish/species/discus/discus.tres,,common +7504,angelfish_freshwater,implemented,inactive,missing icon,res://fish/species/angelfish_freshwater/angelfish_freshwater.tres,,common +7505,gourami_giant,implemented,inactive,missing icon,res://fish/species/gourami_giant/gourami_giant.tres,,common +7506,tilapia_nile,implemented,inactive,missing icon,res://fish/species/tilapia_nile/tilapia_nile.tres,,common +7507,oscar,implemented,inactive,missing icon,res://fish/species/oscar/oscar.tres,,common +7508,betta_siamese,implemented,inactive,missing icon,res://fish/species/betta_siamese/betta_siamese.tres,,common +7509,tambaqui,implemented,inactive,missing icon,res://fish/species/tambaqui/tambaqui.tres,,common +7510,catfish_walking,implemented,inactive,missing icon,res://fish/species/catfish_walking/catfish_walking.tres,,common +7601,snakehead_giant,implemented,inactive,missing icon,res://fish/species/snakehead_giant/snakehead_giant.tres,,common +7602,dorado_golden,implemented,inactive,missing icon,res://fish/species/dorado_golden/dorado_golden.tres,,common +7603,mahseer_golden,implemented,inactive,missing icon,res://fish/species/mahseer_golden/mahseer_golden.tres,,common +7604,peacock_bass,implemented,inactive,missing icon,res://fish/species/peacock_bass/peacock_bass.tres,,common +7605,piranha_red_bellied,implemented,inactive,missing icon,res://fish/species/piranha_red_bellied/piranha_red_bellied.tres,,common +7606,arowana_silver,implemented,inactive,missing icon,res://fish/species/arowana_silver/arowana_silver.tres,,common +7701,whale_blue,implemented,inactive,missing icon,res://fish/species/whale_blue/whale_blue.tres,,common +7702,dolphin_bottlenose,implemented,inactive,missing icon,res://fish/species/dolphin_bottlenose/dolphin_bottlenose.tres,,common +7703,whale_humpback,implemented,inactive,missing icon,res://fish/species/whale_humpback/whale_humpback.tres,,common +7704,whale_killer,implemented,inactive,missing icon,res://fish/species/whale_killer/whale_killer.tres,,common +7705,whale_sperm,implemented,inactive,missing icon,res://fish/species/whale_sperm/whale_sperm.tres,,common diff --git a/economy/art_shop_stock.gd b/economy/art_shop_stock.gd index acc5382..ff84d09 100644 --- a/economy/art_shop_stock.gd +++ b/economy/art_shop_stock.gd @@ -49,7 +49,7 @@ static func get_display_name(product_id: StringName) -> String: static func get_description(product_id: StringName) -> String: if product_id == ART_KIT_ITEM_ID: - return "Press P in the game world to paint!" + return "Select the Art Kit in the Hotbar to paint." var color_id: StringName = PlayerArtUnlocks.color_id_for_product(product_id) if not color_id.is_empty(): return "Unlocks this marker color in the Paint UI." diff --git a/economy/fishing_shop_stock.gd b/economy/fishing_shop_stock.gd index 87795ad..4f5fda4 100644 --- a/economy/fishing_shop_stock.gd +++ b/economy/fishing_shop_stock.gd @@ -3,10 +3,12 @@ extends RefCounted const ItemCatalogType = preload("res://items/item_catalog.gd") const ItemDataType = preload("res://items/item_data.gd") +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const PlayerBagType = preload("res://inventory/player_bag.gd") const PlayerWalletType = preload("res://economy/player_wallet.gd") const WORM_MAX_STACK: int = 10 const FISH_FINDER_ID: StringName = &"fish_finder" +const MAGNET_ID: StringName = &"magnet" const BATTERIES_ID: StringName = &"batteries" const ITEM_PRICES: Dictionary[StringName, int] = { @@ -22,6 +24,7 @@ const ITEM_PRICES: Dictionary[StringName, int] = { &"energy_drink": 35, &"snack": 30, FISH_FINDER_ID: 500, + MAGNET_ID: 250, BATTERIES_ID: 15, } const BAIT_UNLOCK_PRICES: Dictionary[StringName, int] = { @@ -42,6 +45,7 @@ const ITEM_ORDER: Array[StringName] = [ &"luminous_roe", &"the_standby", FISH_FINDER_ID, + MAGNET_ID, &"coffee", &"energy_drink", &"snack", @@ -57,6 +61,25 @@ static func get_stock_item_ids() -> Array[StringName]: return ITEM_ORDER.duplicate() +static func get_rod_stock( + catalog: ItemCatalogType, +) -> Array[FishingRodDataType]: + var rods: Array[FishingRodDataType] = [] + if catalog == null: + return rods + for item: ItemDataType in catalog.get_available_items(): + var rod := item as FishingRodDataType + if rod != null and rod.is_shop_available(): + rods.append(rod) + rods.sort_custom( + func(left: FishingRodDataType, right: FishingRodDataType) -> bool: + if left.shop_order == right.shop_order: + return str(left.item_id) < str(right.item_id) + return left.shop_order < right.shop_order + ) + return rods + + static func get_unlock_price(item_id: StringName) -> int: return BAIT_UNLOCK_PRICES.get(item_id, -1) @@ -81,7 +104,12 @@ static func is_permanent_unlock( ) -> bool: return ( item != null - and (item.is_lure() or item_id == FISH_FINDER_ID) + and ( + item.is_lure() + or item_id == FISH_FINDER_ID + or item_id == MAGNET_ID + or item is FishingRodDataType + ) ) @@ -111,6 +139,8 @@ static func purchase_one( if wallet == null or bag == null or catalog == null: return false var item: ItemDataType = catalog.get_item_by_id(item_id) + if item == null or not item.is_available(): + return false var bait_topoff: bool = is_bait_topoff(item_id) var permanent_unlock: bool = is_permanent_unlock(item_id, item) var quantity: int = get_purchase_quantity( @@ -118,15 +148,20 @@ static func purchase_one( bag.get_quantity(item_id), item.max_stack if item != null else WORM_MAX_STACK, ) - var price: int = get_purchase_cost( - item_id, - quantity, - bag.is_bait_unlocked(item_id), + var rod := item as FishingRodDataType + var price: int = ( + rod.shop_price + if rod != null + else get_purchase_cost( + item_id, + quantity, + bag.is_bait_unlocked(item_id), + ) ) if ( price < 0 - or item == null - or not item.is_valid() + or not item.is_available() + or (rod != null and not rod.is_shop_available()) or ( item.category != ItemDataType.Category.CONSUMABLE and not bait_topoff diff --git a/fish/fish_data.gd b/fish/fish_data.gd index 2bb99af..60ce03e 100644 --- a/fish/fish_data.gd +++ b/fish/fish_data.gd @@ -26,14 +26,21 @@ enum Rarity { @export var id: StringName @export var display_name: String +@export_category("Developer Catalog") +## Disabled species remain resolvable for saves but cannot be newly selected. +@export var active: bool = true +@export_range(1, 999999, 1) var catalog_number: int = 1 +@export var collection_group: StringName +@export_multiline var logbook_fact: String +@export_category("Fishing") @export_flags("Fresh Water", "Salt Water") var allowed_water_types: int = WaterType.ALL_FISHABLE_MASK @export var rarity: Rarity = Rarity.COMMON @export_range(0.0, 1000.0, 0.01) var base_catch_weight: float = 1.0 @export var catch_profile: CatchDifficultyProfileType @export var availability: FishAvailabilityType -@export_range(0.01, 1000.0, 0.01) var weight_min_lb: float = 0.5 -@export_range(0.01, 1000.0, 0.01) var weight_max_lb: float = 1.0 +@export_range(0.001, 500000.0, 0.001) var weight_min_lb: float = 0.5 +@export_range(0.001, 500000.0, 0.001) var weight_max_lb: float = 1.0 # Retained in resource files for compatibility with existing authored data; # runtime presentation is derived from absolute weight below. @export_range(0.01, 20.0, 0.01) var display_scale_min: float = 0.8 @@ -47,7 +54,8 @@ var allowed_water_types: int = WaterType.ALL_FISHABLE_MASK func is_selectable() -> bool: return ( - not id.is_empty() + active + and not id.is_empty() and base_catch_weight > 0.0 and catch_profile != null and weight_min_lb > 0.0 @@ -74,7 +82,7 @@ func get_primary_water_type() -> WaterType.Type: func get_minimum_weight() -> float: - return maxf(weight_min_lb, 0.01) + return maxf(weight_min_lb, 0.001) func get_maximum_weight() -> float: diff --git a/fish/fish_selector.gd b/fish/fish_selector.gd index 506a906..89bc3ca 100644 --- a/fish/fish_selector.gd +++ b/fish/fish_selector.gd @@ -7,10 +7,12 @@ const FishDataType = preload("res://fish/fish_data.gd") const FishPoolType = preload("res://fish/fish_pool.gd") const FishQualityType = preload("res://fish/fish_quality.gd") const FishingContextType = preload("res://fishing/fishing_context.gd") +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") var undiscovered_weight_multiplier: float = 1.5 var rarity_weight_multipliers: Array[float] = [] var quality_weight_multipliers: Array[float] = [] +var active_rod: FishingRodDataType var use_deterministic_test_seed: bool = false var deterministic_test_seed: int = 24680 var selection_seed: int = 0 @@ -55,8 +57,16 @@ func select_fish( # quality and rarity bands globally; required tags remain authoritative. if not collection_log.has_discovered(fish.id): final_weight *= maxf(undiscovered_weight_multiplier, 0.0) + if active_rod != null: + final_weight *= maxf( + active_rod.undiscovered_weight_multiplier, + 0.0, + ) if fish.rarity >= 0 and fish.rarity < rarity_weight_multipliers.size(): final_weight *= maxf(rarity_weight_multipliers[fish.rarity], 0.0) + if active_rod != null: + final_weight *= active_rod.get_rarity_multiplier(fish.rarity) + final_weight *= active_rod.get_affinity_multiplier(fish, context) if final_weight <= 0.0: continue all_fish.append(fish) @@ -87,6 +97,8 @@ func _roll_rarity(context: FishingContextType) -> int: for index: int in range(weights.size()): if index < rarity_weight_multipliers.size(): weights[index] *= maxf(rarity_weight_multipliers[index], 0.0) + if active_rod != null: + weights[index] *= active_rod.get_rarity_multiplier(index) var total: float = 0.0 for weight: float in weights: total += weight @@ -107,9 +119,13 @@ func create_catch(fish: FishDataType, bait_tags: Array[StringName] = []) -> Fish caught_fish.fish = fish caught_fish.fish_id = fish.id caught_fish.ensure_identity() - caught_fish.weight_lb = _rng.randf_range( + var weight_roll: float = _biased_unit_roll( + active_rod.weight_roll_bias if active_rod != null else 0.0 + ) + caught_fish.weight_lb = lerpf( fish.get_minimum_weight(), - fish.get_maximum_weight() + fish.get_maximum_weight(), + weight_roll, ) caught_fish.display_scale = fish.get_display_scale_for_weight( caught_fish.weight_lb @@ -118,6 +134,11 @@ func create_catch(fish: FishDataType, bait_tags: Array[StringName] = []) -> Fish var quality_multipliers: Array[float] = FishQualityType.roll_weights_for_bait(effective_bait) for quality: int in range(mini(quality_multipliers.size(), quality_weight_multipliers.size())): quality_multipliers[quality] *= maxf(quality_weight_multipliers[quality], 0.0) + for quality: int in range(quality_multipliers.size()): + if active_rod != null: + quality_multipliers[quality] *= active_rod.get_quality_multiplier( + quality + ) caught_fish.quality = FishQualityType.roll( _rng, quality_multipliers, @@ -127,3 +148,14 @@ func create_catch(fish: FishDataType, bait_tags: Array[StringName] = []) -> Fish caught_fish.quality, ) return caught_fish + + +func _biased_unit_roll(bias: float) -> float: + var roll: float = _rng.randf() + var safe_bias: float = clampf(bias, -0.5, 0.5) + if is_zero_approx(safe_bias): + return roll + var exponent: float = 1.0 / (1.0 + absf(safe_bias) * 2.0) + if safe_bias > 0.0: + return pow(roll, exponent) + return 1.0 - pow(1.0 - roll, exponent) diff --git a/fish/pools/fish_catalog.tres b/fish/pools/fish_catalog.tres index 73609c8..666dce2 100644 --- a/fish/pools/fish_catalog.tres +++ b/fish/pools/fish_catalog.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" load_steps=55 format=3] +[gd_resource type="Resource" load_steps=315 format=3] [ext_resource type="Script" path="res://fish/fish_pool.gd" id="1_pool"] [ext_resource type="Resource" path="res://fish/species/bluegill/bluegill.tres" id="2_bluegill"] @@ -54,7 +54,267 @@ [ext_resource type="Resource" path="res://fish/species/trout_rainbow/trout_rainbow.tres" id="52_trout_rainbow"] [ext_resource type="Resource" path="res://fish/species/trout_steelhead/trout_steelhead.tres" id="53_trout_steelhead"] [ext_resource type="Resource" path="res://fish/species/walleye/walleye.tres" id="54_walleye"] +[ext_resource type="Resource" path="res://fish/species/bowfin/bowfin.tres" id="55_bowfin"] +[ext_resource type="Resource" path="res://fish/species/sturgeon_lake/sturgeon_lake.tres" id="56_sturgeon_lake"] +[ext_resource type="Resource" path="res://fish/species/gar_longnose/gar_longnose.tres" id="57_gar_longnose"] +[ext_resource type="Resource" path="res://fish/species/paddlefish/paddlefish.tres" id="58_paddlefish"] +[ext_resource type="Resource" path="res://fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres" id="59_sturgeon_shovelnose"] +[ext_resource type="Resource" path="res://fish/species/gar_spotted/gar_spotted.tres" id="60_gar_spotted"] +[ext_resource type="Resource" path="res://fish/species/lungfish_west_african/lungfish_west_african.tres" id="61_lungfish_west_african"] +[ext_resource type="Resource" path="res://fish/species/mudskipper_atlantic/mudskipper_atlantic.tres" id="62_mudskipper_atlantic"] +[ext_resource type="Resource" path="res://fish/species/foureyes_largescale/foureyes_largescale.tres" id="63_foureyes_largescale"] +[ext_resource type="Resource" path="res://fish/species/mullet_red/mullet_red.tres" id="64_mullet_red"] +[ext_resource type="Resource" path="res://fish/species/plaice_european/plaice_european.tres" id="65_plaice_european"] +[ext_resource type="Resource" path="res://fish/species/flounder_summer/flounder_summer.tres" id="66_flounder_summer"] +[ext_resource type="Resource" path="res://fish/species/flounder_winter/flounder_winter.tres" id="67_flounder_winter"] +[ext_resource type="Resource" path="res://fish/species/dugong/dugong.tres" id="68_dugong"] +[ext_resource type="Resource" path="res://fish/species/seal_harbor/seal_harbor.tres" id="69_seal_harbor"] +[ext_resource type="Resource" path="res://fish/species/sea_otter/sea_otter.tres" id="70_sea_otter"] +[ext_resource type="Resource" path="res://fish/species/walrus/walrus.tres" id="71_walrus"] +[ext_resource type="Resource" path="res://fish/species/manatee_west_indian/manatee_west_indian.tres" id="72_manatee_west_indian"] +[ext_resource type="Resource" path="res://fish/species/pipefish_bay/pipefish_bay.tres" id="73_pipefish_bay"] +[ext_resource type="Resource" path="res://fish/species/seahorse_lined/seahorse_lined.tres" id="74_seahorse_lined"] +[ext_resource type="Resource" path="res://fish/species/monkfish/monkfish.tres" id="75_monkfish"] +[ext_resource type="Resource" path="res://fish/species/tripletail/tripletail.tres" id="76_tripletail"] +[ext_resource type="Resource" path="res://fish/species/bluefish/bluefish.tres" id="77_bluefish"] +[ext_resource type="Resource" path="res://fish/species/jack_crevalle/jack_crevalle.tres" id="78_jack_crevalle"] +[ext_resource type="Resource" path="res://fish/species/queenfish_talang/queenfish_talang.tres" id="79_queenfish_talang"] +[ext_resource type="Resource" path="res://fish/species/sand_lance_american/sand_lance_american.tres" id="80_sand_lance_american"] +[ext_resource type="Resource" path="res://fish/species/menhaden_atlantic/menhaden_atlantic.tres" id="81_menhaden_atlantic"] +[ext_resource type="Resource" path="res://fish/species/sardine_european/sardine_european.tres" id="82_sardine_european"] +[ext_resource type="Resource" path="res://fish/species/sardine_pacific/sardine_pacific.tres" id="83_sardine_pacific"] +[ext_resource type="Resource" path="res://fish/species/shark_blacktip/shark_blacktip.tres" id="84_shark_blacktip"] +[ext_resource type="Resource" path="res://fish/species/shark_great_hammerhead/shark_great_hammerhead.tres" id="85_shark_great_hammerhead"] +[ext_resource type="Resource" path="res://fish/species/shark_great_white/shark_great_white.tres" id="86_shark_great_white"] +[ext_resource type="Resource" path="res://fish/species/shark_tiger/shark_tiger.tres" id="87_shark_tiger"] +[ext_resource type="Resource" path="res://fish/species/shark_whale/shark_whale.tres" id="88_shark_whale"] +[ext_resource type="Resource" path="res://fish/species/burbot/burbot.tres" id="89_burbot"] +[ext_resource type="Resource" path="res://fish/species/cisco/cisco.tres" id="90_cisco"] +[ext_resource type="Resource" path="res://fish/species/whitefish_lake/whitefish_lake.tres" id="91_whitefish_lake"] +[ext_resource type="Resource" path="res://fish/species/char_arctic/char_arctic.tres" id="92_char_arctic"] +[ext_resource type="Resource" path="res://fish/species/grayling_arctic/grayling_arctic.tres" id="93_grayling_arctic"] +[ext_resource type="Resource" path="res://fish/species/trout_brown/trout_brown.tres" id="94_trout_brown"] +[ext_resource type="Resource" path="res://fish/species/wolffish_atlantic/wolffish_atlantic.tres" id="95_wolffish_atlantic"] +[ext_resource type="Resource" path="res://fish/species/cusk/cusk.tres" id="96_cusk"] +[ext_resource type="Resource" path="res://fish/species/wolffish_spotted/wolffish_spotted.tres" id="97_wolffish_spotted"] +[ext_resource type="Resource" path="res://fish/species/herring_atlantic/herring_atlantic.tres" id="98_herring_atlantic"] +[ext_resource type="Resource" path="res://fish/species/capelin/capelin.tres" id="99_capelin"] +[ext_resource type="Resource" path="res://fish/species/sprat_european/sprat_european.tres" id="100_sprat_european"] +[ext_resource type="Resource" path="res://fish/species/herring_pacific/herring_pacific.tres" id="101_herring_pacific"] +[ext_resource type="Resource" path="res://fish/species/pollock_alaska/pollock_alaska.tres" id="102_pollock_alaska"] +[ext_resource type="Resource" path="res://fish/species/cod_atlantic/cod_atlantic.tres" id="103_cod_atlantic"] +[ext_resource type="Resource" path="res://fish/species/pollock_atlantic/pollock_atlantic.tres" id="104_pollock_atlantic"] +[ext_resource type="Resource" path="res://fish/species/sole_dover/sole_dover.tres" id="105_sole_dover"] +[ext_resource type="Resource" path="res://fish/species/haddock/haddock.tres" id="106_haddock"] +[ext_resource type="Resource" path="res://fish/species/cod_pacific/cod_pacific.tres" id="107_cod_pacific"] +[ext_resource type="Resource" path="res://fish/species/hake_pacific/hake_pacific.tres" id="108_hake_pacific"] +[ext_resource type="Resource" path="res://fish/species/hake_silver/hake_silver.tres" id="109_hake_silver"] +[ext_resource type="Resource" path="res://fish/species/nautilus_chambered/nautilus_chambered.tres" id="110_nautilus_chambered"] +[ext_resource type="Resource" path="res://fish/species/cuttlefish_common/cuttlefish_common.tres" id="111_cuttlefish_common"] +[ext_resource type="Resource" path="res://fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres" id="112_cuttlefish_flamboyant"] +[ext_resource type="Resource" path="res://fish/species/tilefish_blueline/tilefish_blueline.tres" id="113_tilefish_blueline"] +[ext_resource type="Resource" path="res://fish/species/tilefish_golden/tilefish_golden.tres" id="114_tilefish_golden"] +[ext_resource type="Resource" path="res://fish/species/ocean_perch_pacific/ocean_perch_pacific.tres" id="115_ocean_perch_pacific"] +[ext_resource type="Resource" path="res://fish/species/sea_bass_chilean/sea_bass_chilean.tres" id="116_sea_bass_chilean"] +[ext_resource type="Resource" path="res://fish/species/sablefish/sablefish.tres" id="117_sablefish"] +[ext_resource type="Resource" path="res://fish/species/wreckfish/wreckfish.tres" id="118_wreckfish"] +[ext_resource type="Resource" path="res://fish/species/oarfish_giant/oarfish_giant.tres" id="119_oarfish_giant"] +[ext_resource type="Resource" path="res://fish/species/coelacanth_west_indian/coelacanth_west_indian.tres" id="120_coelacanth_west_indian"] +[ext_resource type="Resource" path="res://fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres" id="121_anglerfish_black_seadevil"] +[ext_resource type="Resource" path="res://fish/species/fangtooth_common/fangtooth_common.tres" id="122_fangtooth_common"] +[ext_resource type="Resource" path="res://fish/species/gulper_eel/gulper_eel.tres" id="123_gulper_eel"] +[ext_resource type="Resource" path="res://fish/species/barreleye_pacific/barreleye_pacific.tres" id="124_barreleye_pacific"] +[ext_resource type="Resource" path="res://fish/species/blobfish_smooth_head/blobfish_smooth_head.tres" id="125_blobfish_smooth_head"] +[ext_resource type="Resource" path="res://fish/species/lanternfish_spotted/lanternfish_spotted.tres" id="126_lanternfish_spotted"] +[ext_resource type="Resource" path="res://fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres" id="127_sea_star_crown_of_thorns"] +[ext_resource type="Resource" path="res://fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres" id="128_sea_cucumber_giant_california"] +[ext_resource type="Resource" path="res://fish/species/urchin_purple/urchin_purple.tres" id="129_urchin_purple"] +[ext_resource type="Resource" path="res://fish/species/sand_dollar/sand_dollar.tres" id="130_sand_dollar"] +[ext_resource type="Resource" path="res://fish/species/sea_star_sunflower/sea_star_sunflower.tres" id="131_sea_star_sunflower"] +[ext_resource type="Resource" path="res://fish/species/axolotl/axolotl.tres" id="132_axolotl"] +[ext_resource type="Resource" path="res://fish/species/hellbender/hellbender.tres" id="133_hellbender"] +[ext_resource type="Resource" path="res://fish/species/guppy/guppy.tres" id="134_guppy"] +[ext_resource type="Resource" path="res://fish/species/tetra_neon/tetra_neon.tres" id="135_tetra_neon"] +[ext_resource type="Resource" path="res://fish/species/danio_zebra/danio_zebra.tres" id="136_danio_zebra"] +[ext_resource type="Resource" path="res://fish/species/largemouth_bass/largemouth_bass.tres" id="137_largemouth_bass"] +[ext_resource type="Resource" path="res://fish/species/smallmouth_bass/smallmouth_bass.tres" id="138_smallmouth_bass"] +[ext_resource type="Resource" path="res://fish/species/buffalo_bigmouth/buffalo_bigmouth.tres" id="139_buffalo_bigmouth"] +[ext_resource type="Resource" path="res://fish/species/redhorse_golden/redhorse_golden.tres" id="140_redhorse_golden"] +[ext_resource type="Resource" path="res://fish/species/quillback/quillback.tres" id="141_quillback"] +[ext_resource type="Resource" path="res://fish/species/buffalo_smallmouth/buffalo_smallmouth.tres" id="142_buffalo_smallmouth"] +[ext_resource type="Resource" path="res://fish/species/sucker_white/sucker_white.tres" id="143_sucker_white"] +[ext_resource type="Resource" path="res://fish/species/bullhead_black/bullhead_black.tres" id="144_bullhead_black"] +[ext_resource type="Resource" path="res://fish/species/bullhead_brown/bullhead_brown.tres" id="145_bullhead_brown"] +[ext_resource type="Resource" path="res://fish/species/madtom_tadpole/madtom_tadpole.tres" id="146_madtom_tadpole"] +[ext_resource type="Resource" path="res://fish/species/bullhead_yellow/bullhead_yellow.tres" id="147_bullhead_yellow"] +[ext_resource type="Resource" path="res://fish/species/barbel_common/barbel_common.tres" id="148_barbel_common"] +[ext_resource type="Resource" path="res://fish/species/bream_common/bream_common.tres" id="149_bream_common"] +[ext_resource type="Resource" path="res://fish/species/roach_common/roach_common.tres" id="150_roach_common"] +[ext_resource type="Resource" path="res://fish/species/fallfish/fallfish.tres" id="151_fallfish"] +[ext_resource type="Resource" path="res://fish/species/ide/ide.tres" id="152_ide"] +[ext_resource type="Resource" path="res://fish/species/rudd/rudd.tres" id="153_rudd"] +[ext_resource type="Resource" path="res://fish/species/tench/tench.tres" id="154_tench"] +[ext_resource type="Resource" path="res://fish/species/crayfish_red_swamp/crayfish_red_swamp.tres" id="155_crayfish_red_swamp"] +[ext_resource type="Resource" path="res://fish/species/gar_alligator/gar_alligator.tres" id="156_gar_alligator"] +[ext_resource type="Resource" path="res://fish/species/arapaima/arapaima.tres" id="157_arapaima"] +[ext_resource type="Resource" path="res://fish/species/tigerfish_goliath/tigerfish_goliath.tres" id="158_tigerfish_goliath"] +[ext_resource type="Resource" path="res://fish/species/muskellunge/muskellunge.tres" id="159_muskellunge"] +[ext_resource type="Resource" path="res://fish/species/shiner_common/shiner_common.tres" id="160_shiner_common"] +[ext_resource type="Resource" path="res://fish/species/chub_creek/chub_creek.tres" id="161_chub_creek"] +[ext_resource type="Resource" path="res://fish/species/shiner_emerald/shiner_emerald.tres" id="162_shiner_emerald"] +[ext_resource type="Resource" path="res://fish/species/minnow_fathead/minnow_fathead.tres" id="163_minnow_fathead"] +[ext_resource type="Resource" path="res://fish/species/shiner_golden/shiner_golden.tres" id="164_shiner_golden"] +[ext_resource type="Resource" path="res://fish/species/electric_eel/electric_eel.tres" id="165_electric_eel"] +[ext_resource type="Resource" path="res://fish/species/freshwater_drum/freshwater_drum.tres" id="166_freshwater_drum"] +[ext_resource type="Resource" path="res://fish/species/goldeye/goldeye.tres" id="167_goldeye"] +[ext_resource type="Resource" path="res://fish/species/mooneye/mooneye.tres" id="168_mooneye"] +[ext_resource type="Resource" path="res://fish/species/loach_weather/loach_weather.tres" id="169_loach_weather"] +[ext_resource type="Resource" path="res://fish/species/koi/koi.tres" id="170_koi"] +[ext_resource type="Resource" path="res://fish/species/crappie_black/crappie_black.tres" id="171_crappie_black"] +[ext_resource type="Resource" path="res://fish/species/green_sunfish/green_sunfish.tres" id="172_green_sunfish"] +[ext_resource type="Resource" path="res://fish/species/pumpkinseed/pumpkinseed.tres" id="173_pumpkinseed"] +[ext_resource type="Resource" path="res://fish/species/redear_sunfish/redear_sunfish.tres" id="174_redear_sunfish"] +[ext_resource type="Resource" path="res://fish/species/warmouth/warmouth.tres" id="175_warmouth"] +[ext_resource type="Resource" path="res://fish/species/crappie_white/crappie_white.tres" id="176_crappie_white"] +[ext_resource type="Resource" path="res://fish/species/yellow_perch/yellow_perch.tres" id="177_yellow_perch"] +[ext_resource type="Resource" path="res://fish/species/pickerel_chain/pickerel_chain.tres" id="178_pickerel_chain"] +[ext_resource type="Resource" path="res://fish/species/pickerel_grass/pickerel_grass.tres" id="179_pickerel_grass"] +[ext_resource type="Resource" path="res://fish/species/pike_northern/pike_northern.tres" id="180_pike_northern"] +[ext_resource type="Resource" path="res://fish/species/jelly_crystal/jelly_crystal.tres" id="181_jelly_crystal"] +[ext_resource type="Resource" path="res://fish/species/jelly_lions_mane/jelly_lions_mane.tres" id="182_jelly_lions_mane"] +[ext_resource type="Resource" path="res://fish/species/jelly_moon/jelly_moon.tres" id="183_jelly_moon"] +[ext_resource type="Resource" path="res://fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres" id="184_jelly_pacific_sea_nettle"] +[ext_resource type="Resource" path="res://fish/species/jelly_sea_wasp/jelly_sea_wasp.tres" id="185_jelly_sea_wasp"] +[ext_resource type="Resource" path="res://fish/species/pompano_african/pompano_african.tres" id="186_pompano_african"] +[ext_resource type="Resource" path="res://fish/species/cobia/cobia.tres" id="187_cobia"] +[ext_resource type="Resource" path="res://fish/species/trevally_giant/trevally_giant.tres" id="188_trevally_giant"] +[ext_resource type="Resource" path="res://fish/species/amberjack_greater/amberjack_greater.tres" id="189_amberjack_greater"] +[ext_resource type="Resource" path="res://fish/species/amberjack_lesser/amberjack_lesser.tres" id="190_amberjack_lesser"] +[ext_resource type="Resource" path="res://fish/species/halibut_atlantic/halibut_atlantic.tres" id="191_halibut_atlantic"] +[ext_resource type="Resource" path="res://fish/species/halibut_pacific/halibut_pacific.tres" id="192_halibut_pacific"] +[ext_resource type="Resource" path="res://fish/species/turbot/turbot.tres" id="193_turbot"] +[ext_resource type="Resource" path="res://fish/species/lobster_american/lobster_american.tres" id="194_lobster_american"] +[ext_resource type="Resource" path="res://fish/species/krill_antarctic/krill_antarctic.tres" id="195_krill_antarctic"] +[ext_resource type="Resource" path="res://fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres" id="196_lobster_caribbean_spiny"] +[ext_resource type="Resource" path="res://fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres" id="197_shrimp_peacock_mantis"] +[ext_resource type="Resource" path="res://fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres" id="198_shrimp_skunk_cleaner"] +[ext_resource type="Resource" path="res://fish/species/crab_ghost/crab_ghost.tres" id="199_crab_ghost"] +[ext_resource type="Resource" path="res://fish/species/crab_blue/crab_blue.tres" id="200_crab_blue"] +[ext_resource type="Resource" path="res://fish/species/crab_dungeness/crab_dungeness.tres" id="201_crab_dungeness"] +[ext_resource type="Resource" path="res://fish/species/crab_japanese_spider/crab_japanese_spider.tres" id="202_crab_japanese_spider"] +[ext_resource type="Resource" path="res://fish/species/crab_red_king/crab_red_king.tres" id="203_crab_red_king"] +[ext_resource type="Resource" path="res://fish/species/eel_american/eel_american.tres" id="204_eel_american"] +[ext_resource type="Resource" path="res://fish/species/eel_european/eel_european.tres" id="205_eel_european"] +[ext_resource type="Resource" path="res://fish/species/smelt_rainbow/smelt_rainbow.tres" id="206_smelt_rainbow"] +[ext_resource type="Resource" path="res://fish/species/smelt_eulachon/smelt_eulachon.tres" id="207_smelt_eulachon"] +[ext_resource type="Resource" path="res://fish/species/sturgeon_white/sturgeon_white.tres" id="208_sturgeon_white"] +[ext_resource type="Resource" path="res://fish/species/mahi_mahi/mahi_mahi.tres" id="209_mahi_mahi"] +[ext_resource type="Resource" path="res://fish/species/opah/opah.tres" id="210_opah"] +[ext_resource type="Resource" path="res://fish/species/wahoo/wahoo.tres" id="211_wahoo"] +[ext_resource type="Resource" path="res://fish/species/octopus_common/octopus_common.tres" id="212_octopus_common"] +[ext_resource type="Resource" path="res://fish/species/octopus_day/octopus_day.tres" id="213_octopus_day"] +[ext_resource type="Resource" path="res://fish/species/octopus_giant_pacific/octopus_giant_pacific.tres" id="214_octopus_giant_pacific"] +[ext_resource type="Resource" path="res://fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres" id="215_octopus_greater_blue_ringed"] +[ext_resource type="Resource" path="res://fish/species/skate_barndoor/skate_barndoor.tres" id="216_skate_barndoor"] +[ext_resource type="Resource" path="res://fish/species/manta_ray_giant/manta_ray_giant.tres" id="217_manta_ray_giant"] +[ext_resource type="Resource" path="res://fish/species/sawfish_largetooth/sawfish_largetooth.tres" id="218_sawfish_largetooth"] +[ext_resource type="Resource" path="res://fish/species/stingray_ocellate_river/stingray_ocellate_river.tres" id="219_stingray_ocellate_river"] +[ext_resource type="Resource" path="res://fish/species/stingray_southern/stingray_southern.tres" id="220_stingray_southern"] +[ext_resource type="Resource" path="res://fish/species/lionfish_red/lionfish_red.tres" id="221_lionfish_red"] +[ext_resource type="Resource" path="res://fish/species/scorpionfish_red/scorpionfish_red.tres" id="222_scorpionfish_red"] +[ext_resource type="Resource" path="res://fish/species/moray_green/moray_green.tres" id="223_moray_green"] +[ext_resource type="Resource" path="res://fish/species/flounder_peacock/flounder_peacock.tres" id="224_flounder_peacock"] +[ext_resource type="Resource" path="res://fish/species/surgeonfish_blue/surgeonfish_blue.tres" id="225_surgeonfish_blue"] +[ext_resource type="Resource" path="res://fish/species/parrotfish_rainbow/parrotfish_rainbow.tres" id="226_parrotfish_rainbow"] +[ext_resource type="Resource" path="res://fish/species/parrotfish_stoplight/parrotfish_stoplight.tres" id="227_parrotfish_stoplight"] +[ext_resource type="Resource" path="res://fish/species/tang_yellow/tang_yellow.tres" id="228_tang_yellow"] +[ext_resource type="Resource" path="res://fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres" id="229_trumpetfish_atlantic"] +[ext_resource type="Resource" path="res://fish/species/triggerfish_gray/triggerfish_gray.tres" id="230_triggerfish_gray"] +[ext_resource type="Resource" path="res://fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres" id="231_pufferfish_guineafowl"] +[ext_resource type="Resource" path="res://fish/species/cowfish_longhorn/cowfish_longhorn.tres" id="232_cowfish_longhorn"] +[ext_resource type="Resource" path="res://fish/species/triggerfish_queen/triggerfish_queen.tres" id="233_triggerfish_queen"] +[ext_resource type="Resource" path="res://fish/species/cornetfish_red/cornetfish_red.tres" id="234_cornetfish_red"] +[ext_resource type="Resource" path="res://fish/species/porcupinefish_spotted/porcupinefish_spotted.tres" id="235_porcupinefish_spotted"] +[ext_resource type="Resource" path="res://fish/species/boxfish_yellow/boxfish_yellow.tres" id="236_boxfish_yellow"] +[ext_resource type="Resource" path="res://fish/species/butterflyfish_copperband/butterflyfish_copperband.tres" id="237_butterflyfish_copperband"] +[ext_resource type="Resource" path="res://fish/species/clownfish_ocellaris/clownfish_ocellaris.tres" id="238_clownfish_ocellaris"] +[ext_resource type="Resource" path="res://fish/species/angelfish_queen/angelfish_queen.tres" id="239_angelfish_queen"] +[ext_resource type="Resource" path="res://fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres" id="240_grouper_atlantic_goliath"] +[ext_resource type="Resource" path="res://fish/species/trevally_bluefin/trevally_bluefin.tres" id="241_trevally_bluefin"] +[ext_resource type="Resource" path="res://fish/species/grouper_giant/grouper_giant.tres" id="242_grouper_giant"] +[ext_resource type="Resource" path="res://fish/species/barracuda_great/barracuda_great.tres" id="243_barracuda_great"] +[ext_resource type="Resource" path="res://fish/species/grouper_nassau/grouper_nassau.tres" id="244_grouper_nassau"] +[ext_resource type="Resource" path="res://fish/species/chromis_blue_green/chromis_blue_green.tres" id="245_chromis_blue_green"] +[ext_resource type="Resource" path="res://fish/species/grunt_bluestriped/grunt_bluestriped.tres" id="246_grunt_bluestriped"] +[ext_resource type="Resource" path="res://fish/species/grunt_french/grunt_french.tres" id="247_grunt_french"] +[ext_resource type="Resource" path="res://fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres" id="248_damselfish_sergeant_major"] +[ext_resource type="Resource" path="res://fish/species/wrasse_ballan/wrasse_ballan.tres" id="249_wrasse_ballan"] +[ext_resource type="Resource" path="res://fish/species/wrasse_cleaner/wrasse_cleaner.tres" id="250_wrasse_cleaner"] +[ext_resource type="Resource" path="res://fish/species/hogfish/hogfish.tres" id="251_hogfish"] +[ext_resource type="Resource" path="res://fish/species/turtle_green/turtle_green.tres" id="252_turtle_green"] +[ext_resource type="Resource" path="res://fish/species/turtle_hawksbill/turtle_hawksbill.tres" id="253_turtle_hawksbill"] +[ext_resource type="Resource" path="res://fish/species/turtle_leatherback/turtle_leatherback.tres" id="254_turtle_leatherback"] +[ext_resource type="Resource" path="res://fish/species/turtle_loggerhead/turtle_loggerhead.tres" id="255_turtle_loggerhead"] +[ext_resource type="Resource" path="res://fish/species/seadragon_leafy/seadragon_leafy.tres" id="256_seadragon_leafy"] +[ext_resource type="Resource" path="res://fish/species/seadragon_weedy/seadragon_weedy.tres" id="257_seadragon_weedy"] +[ext_resource type="Resource" path="res://fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres" id="258_oyster_black_lip_pearl"] +[ext_resource type="Resource" path="res://fish/species/clam_giant/clam_giant.tres" id="259_clam_giant"] +[ext_resource type="Resource" path="res://fish/species/clam_geoduck/clam_geoduck.tres" id="260_clam_geoduck"] +[ext_resource type="Resource" path="res://fish/species/conch_queen/conch_queen.tres" id="261_conch_queen"] +[ext_resource type="Resource" path="res://fish/species/abalone_red/abalone_red.tres" id="262_abalone_red"] +[ext_resource type="Resource" path="res://fish/species/squid_bigfin_reef/squid_bigfin_reef.tres" id="263_squid_bigfin_reef"] +[ext_resource type="Resource" path="res://fish/species/squid_colossal/squid_colossal.tres" id="264_squid_colossal"] +[ext_resource type="Resource" path="res://fish/species/squid_giant/squid_giant.tres" id="265_squid_giant"] +[ext_resource type="Resource" path="res://fish/species/squid_humboldt/squid_humboldt.tres" id="266_squid_humboldt"] +[ext_resource type="Resource" path="res://fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres" id="267_halfbeak_ballyhoo"] +[ext_resource type="Resource" path="res://fish/species/needlefish_hound/needlefish_hound.tres" id="268_needlefish_hound"] +[ext_resource type="Resource" path="res://fish/species/flyingfish_tropical/flyingfish_tropical.tres" id="269_flyingfish_tropical"] +[ext_resource type="Resource" path="res://fish/species/croaker_atlantic/croaker_atlantic.tres" id="270_croaker_atlantic"] +[ext_resource type="Resource" path="res://fish/species/black_drum/black_drum.tres" id="271_black_drum"] +[ext_resource type="Resource" path="res://fish/species/red_drum/red_drum.tres" id="272_red_drum"] +[ext_resource type="Resource" path="res://fish/species/mullet_striped/mullet_striped.tres" id="273_mullet_striped"] +[ext_resource type="Resource" path="res://fish/species/weakfish/weakfish.tres" id="274_weakfish"] +[ext_resource type="Resource" path="res://fish/species/white_perch/white_perch.tres" id="275_white_perch"] +[ext_resource type="Resource" path="res://fish/species/croaker_yellowfin/croaker_yellowfin.tres" id="276_croaker_yellowfin"] +[ext_resource type="Resource" path="res://fish/species/rockfish_black/rockfish_black.tres" id="277_rockfish_black"] +[ext_resource type="Resource" path="res://fish/species/sea_bass_black/sea_bass_black.tres" id="278_sea_bass_black"] +[ext_resource type="Resource" path="res://fish/species/rockfish_canary/rockfish_canary.tres" id="279_rockfish_canary"] +[ext_resource type="Resource" path="res://fish/species/porgy_scup/porgy_scup.tres" id="280_porgy_scup"] +[ext_resource type="Resource" path="res://fish/species/sheepshead/sheepshead.tres" id="281_sheepshead"] +[ext_resource type="Resource" path="res://fish/species/tautog/tautog.tres" id="282_tautog"] +[ext_resource type="Resource" path="res://fish/species/rockfish_yelloweye/rockfish_yelloweye.tres" id="283_rockfish_yelloweye"] +[ext_resource type="Resource" path="res://fish/species/lingcod/lingcod.tres" id="284_lingcod"] +[ext_resource type="Resource" path="res://fish/species/milkfish/milkfish.tres" id="285_milkfish"] +[ext_resource type="Resource" path="res://fish/species/roosterfish/roosterfish.tres" id="286_roosterfish"] +[ext_resource type="Resource" path="res://fish/species/tarpon_atlantic/tarpon_atlantic.tres" id="287_tarpon_atlantic"] +[ext_resource type="Resource" path="res://fish/species/barramundi/barramundi.tres" id="288_barramundi"] +[ext_resource type="Resource" path="res://fish/species/snook_common/snook_common.tres" id="289_snook_common"] +[ext_resource type="Resource" path="res://fish/species/bonefish/bonefish.tres" id="290_bonefish"] +[ext_resource type="Resource" path="res://fish/species/pompano_florida/pompano_florida.tres" id="291_pompano_florida"] +[ext_resource type="Resource" path="res://fish/species/ladyfish/ladyfish.tres" id="292_ladyfish"] +[ext_resource type="Resource" path="res://fish/species/permit/permit.tres" id="293_permit"] +[ext_resource type="Resource" path="res://fish/species/knifefish_clown/knifefish_clown.tres" id="294_knifefish_clown"] +[ext_resource type="Resource" path="res://fish/species/loach_clown/loach_clown.tres" id="295_loach_clown"] +[ext_resource type="Resource" path="res://fish/species/discus/discus.tres" id="296_discus"] +[ext_resource type="Resource" path="res://fish/species/angelfish_freshwater/angelfish_freshwater.tres" id="297_angelfish_freshwater"] +[ext_resource type="Resource" path="res://fish/species/gourami_giant/gourami_giant.tres" id="298_gourami_giant"] +[ext_resource type="Resource" path="res://fish/species/tilapia_nile/tilapia_nile.tres" id="299_tilapia_nile"] +[ext_resource type="Resource" path="res://fish/species/oscar/oscar.tres" id="300_oscar"] +[ext_resource type="Resource" path="res://fish/species/betta_siamese/betta_siamese.tres" id="301_betta_siamese"] +[ext_resource type="Resource" path="res://fish/species/tambaqui/tambaqui.tres" id="302_tambaqui"] +[ext_resource type="Resource" path="res://fish/species/catfish_walking/catfish_walking.tres" id="303_catfish_walking"] +[ext_resource type="Resource" path="res://fish/species/snakehead_giant/snakehead_giant.tres" id="304_snakehead_giant"] +[ext_resource type="Resource" path="res://fish/species/dorado_golden/dorado_golden.tres" id="305_dorado_golden"] +[ext_resource type="Resource" path="res://fish/species/mahseer_golden/mahseer_golden.tres" id="306_mahseer_golden"] +[ext_resource type="Resource" path="res://fish/species/peacock_bass/peacock_bass.tres" id="307_peacock_bass"] +[ext_resource type="Resource" path="res://fish/species/piranha_red_bellied/piranha_red_bellied.tres" id="308_piranha_red_bellied"] +[ext_resource type="Resource" path="res://fish/species/arowana_silver/arowana_silver.tres" id="309_arowana_silver"] +[ext_resource type="Resource" path="res://fish/species/whale_blue/whale_blue.tres" id="310_whale_blue"] +[ext_resource type="Resource" path="res://fish/species/dolphin_bottlenose/dolphin_bottlenose.tres" id="311_dolphin_bottlenose"] +[ext_resource type="Resource" path="res://fish/species/whale_humpback/whale_humpback.tres" id="312_whale_humpback"] +[ext_resource type="Resource" path="res://fish/species/whale_killer/whale_killer.tres" id="313_whale_killer"] +[ext_resource type="Resource" path="res://fish/species/whale_sperm/whale_sperm.tres" id="314_whale_sperm"] [resource] script = ExtResource("1_pool") -candidates = [ExtResource("2_bluegill"), ExtResource("3_bass"), ExtResource("4_carp"), ExtResource("5_sunfish"), ExtResource("6_catfish_blue"), ExtResource("7_catfish_channel"), ExtResource("8_catfish_flathead"), ExtResource("9_catfish_white"), ExtResource("10_tuna_albacore"), ExtResource("11_tuna_bigeye"), ExtResource("12_tuna_bluefin"), ExtResource("13_tuna_skipjack"), ExtResource("14_tuna_yellowfin"), ExtResource("15_goby_round"), ExtResource("16_salmon_atlantic"), ExtResource("17_salmon_chum"), ExtResource("18_salmon_coho"), ExtResource("19_salmon_pink"), ExtResource("20_salmon_sockeye"), ExtResource("21_anchovy_european"), ExtResource("22_anchovy_northern"), ExtResource("23_chub_european"), ExtResource("24_chub_flame"), ExtResource("25_chub_lake"), ExtResource("26_goldfish"), ExtResource("27_goldfish_bubbleeye"), ExtResource("28_grouper_gulf"), ExtResource("29_grouper_red"), ExtResource("30_mackerel_atlantic"), ExtResource("31_mackerel_cero"), ExtResource("32_mackerel_chub"), ExtResource("33_mackerel_king"), ExtResource("34_mackerel_spanish"), ExtResource("35_marlin_black"), ExtResource("36_marlin_blue"), ExtResource("37_marlin_white"), ExtResource("38_pomfret_black"), ExtResource("39_pomfret_chinese"), ExtResource("40_pomfret_golden"), ExtResource("41_pomfret_white"), ExtResource("42_sailfish"), ExtResource("43_sauger"), ExtResource("44_saugeye"), ExtResource("45_snapper_lane"), ExtResource("46_snapper_mangrove"), ExtResource("47_snapper_mutton"), ExtResource("48_snapper_red"), ExtResource("49_swordfish"), ExtResource("50_trout_cutthroat"), ExtResource("51_trout_golden"), ExtResource("52_trout_rainbow"), ExtResource("53_trout_steelhead"), ExtResource("54_walleye")] +candidates = [ExtResource("2_bluegill"), ExtResource("3_bass"), ExtResource("4_carp"), ExtResource("5_sunfish"), ExtResource("6_catfish_blue"), ExtResource("7_catfish_channel"), ExtResource("8_catfish_flathead"), ExtResource("9_catfish_white"), ExtResource("10_tuna_albacore"), ExtResource("11_tuna_bigeye"), ExtResource("12_tuna_bluefin"), ExtResource("13_tuna_skipjack"), ExtResource("14_tuna_yellowfin"), ExtResource("15_goby_round"), ExtResource("16_salmon_atlantic"), ExtResource("17_salmon_chum"), ExtResource("18_salmon_coho"), ExtResource("19_salmon_pink"), ExtResource("20_salmon_sockeye"), ExtResource("21_anchovy_european"), ExtResource("22_anchovy_northern"), ExtResource("23_chub_european"), ExtResource("24_chub_flame"), ExtResource("25_chub_lake"), ExtResource("26_goldfish"), ExtResource("27_goldfish_bubbleeye"), ExtResource("28_grouper_gulf"), ExtResource("29_grouper_red"), ExtResource("30_mackerel_atlantic"), ExtResource("31_mackerel_cero"), ExtResource("32_mackerel_chub"), ExtResource("33_mackerel_king"), ExtResource("34_mackerel_spanish"), ExtResource("35_marlin_black"), ExtResource("36_marlin_blue"), ExtResource("37_marlin_white"), ExtResource("38_pomfret_black"), ExtResource("39_pomfret_chinese"), ExtResource("40_pomfret_golden"), ExtResource("41_pomfret_white"), ExtResource("42_sailfish"), ExtResource("43_sauger"), ExtResource("44_saugeye"), ExtResource("45_snapper_lane"), ExtResource("46_snapper_mangrove"), ExtResource("47_snapper_mutton"), ExtResource("48_snapper_red"), ExtResource("49_swordfish"), ExtResource("50_trout_cutthroat"), ExtResource("51_trout_golden"), ExtResource("52_trout_rainbow"), ExtResource("53_trout_steelhead"), ExtResource("54_walleye"), ExtResource("55_bowfin"), ExtResource("56_sturgeon_lake"), ExtResource("57_gar_longnose"), ExtResource("58_paddlefish"), ExtResource("59_sturgeon_shovelnose"), ExtResource("60_gar_spotted"), ExtResource("61_lungfish_west_african"), ExtResource("62_mudskipper_atlantic"), ExtResource("63_foureyes_largescale"), ExtResource("64_mullet_red"), ExtResource("65_plaice_european"), ExtResource("66_flounder_summer"), ExtResource("67_flounder_winter"), ExtResource("68_dugong"), ExtResource("69_seal_harbor"), ExtResource("70_sea_otter"), ExtResource("71_walrus"), ExtResource("72_manatee_west_indian"), ExtResource("73_pipefish_bay"), ExtResource("74_seahorse_lined"), ExtResource("75_monkfish"), ExtResource("76_tripletail"), ExtResource("77_bluefish"), ExtResource("78_jack_crevalle"), ExtResource("79_queenfish_talang"), ExtResource("80_sand_lance_american"), ExtResource("81_menhaden_atlantic"), ExtResource("82_sardine_european"), ExtResource("83_sardine_pacific"), ExtResource("84_shark_blacktip"), ExtResource("85_shark_great_hammerhead"), ExtResource("86_shark_great_white"), ExtResource("87_shark_tiger"), ExtResource("88_shark_whale"), ExtResource("89_burbot"), ExtResource("90_cisco"), ExtResource("91_whitefish_lake"), ExtResource("92_char_arctic"), ExtResource("93_grayling_arctic"), ExtResource("94_trout_brown"), ExtResource("95_wolffish_atlantic"), ExtResource("96_cusk"), ExtResource("97_wolffish_spotted"), ExtResource("98_herring_atlantic"), ExtResource("99_capelin"), ExtResource("100_sprat_european"), ExtResource("101_herring_pacific"), ExtResource("102_pollock_alaska"), ExtResource("103_cod_atlantic"), ExtResource("104_pollock_atlantic"), ExtResource("105_sole_dover"), ExtResource("106_haddock"), ExtResource("107_cod_pacific"), ExtResource("108_hake_pacific"), ExtResource("109_hake_silver"), ExtResource("110_nautilus_chambered"), ExtResource("111_cuttlefish_common"), ExtResource("112_cuttlefish_flamboyant"), ExtResource("113_tilefish_blueline"), ExtResource("114_tilefish_golden"), ExtResource("115_ocean_perch_pacific"), ExtResource("116_sea_bass_chilean"), ExtResource("117_sablefish"), ExtResource("118_wreckfish"), ExtResource("119_oarfish_giant"), ExtResource("120_coelacanth_west_indian"), ExtResource("121_anglerfish_black_seadevil"), ExtResource("122_fangtooth_common"), ExtResource("123_gulper_eel"), ExtResource("124_barreleye_pacific"), ExtResource("125_blobfish_smooth_head"), ExtResource("126_lanternfish_spotted"), ExtResource("127_sea_star_crown_of_thorns"), ExtResource("128_sea_cucumber_giant_california"), ExtResource("129_urchin_purple"), ExtResource("130_sand_dollar"), ExtResource("131_sea_star_sunflower"), ExtResource("132_axolotl"), ExtResource("133_hellbender"), ExtResource("134_guppy"), ExtResource("135_tetra_neon"), ExtResource("136_danio_zebra"), ExtResource("137_largemouth_bass"), ExtResource("138_smallmouth_bass"), ExtResource("139_buffalo_bigmouth"), ExtResource("140_redhorse_golden"), ExtResource("141_quillback"), ExtResource("142_buffalo_smallmouth"), ExtResource("143_sucker_white"), ExtResource("144_bullhead_black"), ExtResource("145_bullhead_brown"), ExtResource("146_madtom_tadpole"), ExtResource("147_bullhead_yellow"), ExtResource("148_barbel_common"), ExtResource("149_bream_common"), ExtResource("150_roach_common"), ExtResource("151_fallfish"), ExtResource("152_ide"), ExtResource("153_rudd"), ExtResource("154_tench"), ExtResource("155_crayfish_red_swamp"), ExtResource("156_gar_alligator"), ExtResource("157_arapaima"), ExtResource("158_tigerfish_goliath"), ExtResource("159_muskellunge"), ExtResource("160_shiner_common"), ExtResource("161_chub_creek"), ExtResource("162_shiner_emerald"), ExtResource("163_minnow_fathead"), ExtResource("164_shiner_golden"), ExtResource("165_electric_eel"), ExtResource("166_freshwater_drum"), ExtResource("167_goldeye"), ExtResource("168_mooneye"), ExtResource("169_loach_weather"), ExtResource("170_koi"), ExtResource("171_crappie_black"), ExtResource("172_green_sunfish"), ExtResource("173_pumpkinseed"), ExtResource("174_redear_sunfish"), ExtResource("175_warmouth"), ExtResource("176_crappie_white"), ExtResource("177_yellow_perch"), ExtResource("178_pickerel_chain"), ExtResource("179_pickerel_grass"), ExtResource("180_pike_northern"), ExtResource("181_jelly_crystal"), ExtResource("182_jelly_lions_mane"), ExtResource("183_jelly_moon"), ExtResource("184_jelly_pacific_sea_nettle"), ExtResource("185_jelly_sea_wasp"), ExtResource("186_pompano_african"), ExtResource("187_cobia"), ExtResource("188_trevally_giant"), ExtResource("189_amberjack_greater"), ExtResource("190_amberjack_lesser"), ExtResource("191_halibut_atlantic"), ExtResource("192_halibut_pacific"), ExtResource("193_turbot"), ExtResource("194_lobster_american"), ExtResource("195_krill_antarctic"), ExtResource("196_lobster_caribbean_spiny"), ExtResource("197_shrimp_peacock_mantis"), ExtResource("198_shrimp_skunk_cleaner"), ExtResource("199_crab_ghost"), ExtResource("200_crab_blue"), ExtResource("201_crab_dungeness"), ExtResource("202_crab_japanese_spider"), ExtResource("203_crab_red_king"), ExtResource("204_eel_american"), ExtResource("205_eel_european"), ExtResource("206_smelt_rainbow"), ExtResource("207_smelt_eulachon"), ExtResource("208_sturgeon_white"), ExtResource("209_mahi_mahi"), ExtResource("210_opah"), ExtResource("211_wahoo"), ExtResource("212_octopus_common"), ExtResource("213_octopus_day"), ExtResource("214_octopus_giant_pacific"), ExtResource("215_octopus_greater_blue_ringed"), ExtResource("216_skate_barndoor"), ExtResource("217_manta_ray_giant"), ExtResource("218_sawfish_largetooth"), ExtResource("219_stingray_ocellate_river"), ExtResource("220_stingray_southern"), ExtResource("221_lionfish_red"), ExtResource("222_scorpionfish_red"), ExtResource("223_moray_green"), ExtResource("224_flounder_peacock"), ExtResource("225_surgeonfish_blue"), ExtResource("226_parrotfish_rainbow"), ExtResource("227_parrotfish_stoplight"), ExtResource("228_tang_yellow"), ExtResource("229_trumpetfish_atlantic"), ExtResource("230_triggerfish_gray"), ExtResource("231_pufferfish_guineafowl"), ExtResource("232_cowfish_longhorn"), ExtResource("233_triggerfish_queen"), ExtResource("234_cornetfish_red"), ExtResource("235_porcupinefish_spotted"), ExtResource("236_boxfish_yellow"), ExtResource("237_butterflyfish_copperband"), ExtResource("238_clownfish_ocellaris"), ExtResource("239_angelfish_queen"), ExtResource("240_grouper_atlantic_goliath"), ExtResource("241_trevally_bluefin"), ExtResource("242_grouper_giant"), ExtResource("243_barracuda_great"), ExtResource("244_grouper_nassau"), ExtResource("245_chromis_blue_green"), ExtResource("246_grunt_bluestriped"), ExtResource("247_grunt_french"), ExtResource("248_damselfish_sergeant_major"), ExtResource("249_wrasse_ballan"), ExtResource("250_wrasse_cleaner"), ExtResource("251_hogfish"), ExtResource("252_turtle_green"), ExtResource("253_turtle_hawksbill"), ExtResource("254_turtle_leatherback"), ExtResource("255_turtle_loggerhead"), ExtResource("256_seadragon_leafy"), ExtResource("257_seadragon_weedy"), ExtResource("258_oyster_black_lip_pearl"), ExtResource("259_clam_giant"), ExtResource("260_clam_geoduck"), ExtResource("261_conch_queen"), ExtResource("262_abalone_red"), ExtResource("263_squid_bigfin_reef"), ExtResource("264_squid_colossal"), ExtResource("265_squid_giant"), ExtResource("266_squid_humboldt"), ExtResource("267_halfbeak_ballyhoo"), ExtResource("268_needlefish_hound"), ExtResource("269_flyingfish_tropical"), ExtResource("270_croaker_atlantic"), ExtResource("271_black_drum"), ExtResource("272_red_drum"), ExtResource("273_mullet_striped"), ExtResource("274_weakfish"), ExtResource("275_white_perch"), ExtResource("276_croaker_yellowfin"), ExtResource("277_rockfish_black"), ExtResource("278_sea_bass_black"), ExtResource("279_rockfish_canary"), ExtResource("280_porgy_scup"), ExtResource("281_sheepshead"), ExtResource("282_tautog"), ExtResource("283_rockfish_yelloweye"), ExtResource("284_lingcod"), ExtResource("285_milkfish"), ExtResource("286_roosterfish"), ExtResource("287_tarpon_atlantic"), ExtResource("288_barramundi"), ExtResource("289_snook_common"), ExtResource("290_bonefish"), ExtResource("291_pompano_florida"), ExtResource("292_ladyfish"), ExtResource("293_permit"), ExtResource("294_knifefish_clown"), ExtResource("295_loach_clown"), ExtResource("296_discus"), ExtResource("297_angelfish_freshwater"), ExtResource("298_gourami_giant"), ExtResource("299_tilapia_nile"), ExtResource("300_oscar"), ExtResource("301_betta_siamese"), ExtResource("302_tambaqui"), ExtResource("303_catfish_walking"), ExtResource("304_snakehead_giant"), ExtResource("305_dorado_golden"), ExtResource("306_mahseer_golden"), ExtResource("307_peacock_bass"), ExtResource("308_piranha_red_bellied"), ExtResource("309_arowana_silver"), ExtResource("310_whale_blue"), ExtResource("311_dolphin_bottlenose"), ExtResource("312_whale_humpback"), ExtResource("313_whale_killer"), ExtResource("314_whale_sperm")] diff --git a/fish/species/abalone_red/abalone_red.tres b/fish/species/abalone_red/abalone_red.tres new file mode 100644 index 0000000..039c7e2 --- /dev/null +++ b/fish/species/abalone_red/abalone_red.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"abalone_red" +display_name = "red abalone" +active = false +catalog_number = 6405 +collection_group = &"Shellfish" +logbook_fact = "red abalones cling to pacific rocks with broad muscular feet. rows of shell holes release water that has passed over the gills." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.09 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 12.0 +sell_value_min = 24 +sell_value_max = 56 +sell_value_curve = 0.88 diff --git a/fish/species/amberjack_greater/amberjack_greater.tres b/fish/species/amberjack_greater/amberjack_greater.tres new file mode 100644 index 0000000..53ea638 --- /dev/null +++ b/fish/species/amberjack_greater/amberjack_greater.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"amberjack_greater" +display_name = "greater amberjack" +active = false +catalog_number = 3604 +collection_group = &"Large coastal predators" +logbook_fact = "greater amberjacks circle reefs, wrecks, and offshore platforms. a dark stripe crosses the eye of their sturdy torpedo-shaped bodies." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 90.0 +sell_value_min = 15 +sell_value_max = 42 +sell_value_curve = 0.82 diff --git a/fish/species/amberjack_lesser/amberjack_lesser.tres b/fish/species/amberjack_lesser/amberjack_lesser.tres new file mode 100644 index 0000000..2fd0aec --- /dev/null +++ b/fish/species/amberjack_lesser/amberjack_lesser.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"amberjack_lesser" +display_name = "lesser amberjack" +active = false +catalog_number = 3605 +collection_group = &"Large coastal predators" +logbook_fact = "lesser amberjacks school around deep reefs and floating objects. an enlarged eye suits their preference for dimmer water." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.75 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 20.0 +sell_value_min = 7 +sell_value_max = 18 +sell_value_curve = 0.86 diff --git a/fish/species/anchovy_european/anchovy_european.tres b/fish/species/anchovy_european/anchovy_european.tres index fea09ed..722fbaf 100644 --- a/fish/species/anchovy_european/anchovy_european.tres +++ b/fish/species/anchovy_european/anchovy_european.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"anchovy_european" display_name = "european anchovy" +active = true +catalog_number = 805 +collection_group = &"Coastal schooling fish" +logbook_fact = "european anchovies form dense schools and feed by filtering tiny plankton from coastal water." allowed_water_types = 2 base_catch_weight = 0.5 catch_profile = ExtResource("2_profile") diff --git a/fish/species/anchovy_northern/anchovy_northern.tres b/fish/species/anchovy_northern/anchovy_northern.tres index ad53d6e..a1940d5 100644 --- a/fish/species/anchovy_northern/anchovy_northern.tres +++ b/fish/species/anchovy_northern/anchovy_northern.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"anchovy_northern" display_name = "northern anchovy" +active = true +catalog_number = 808 +collection_group = &"Coastal schooling fish" +logbook_fact = "northern anchovies gather in huge schools along the pacific coast and filter plankton with their fine gill rakers." allowed_water_types = 2 base_catch_weight = 0.5 catch_profile = ExtResource("2_profile") diff --git a/fish/species/angelfish_freshwater/angelfish_freshwater.tres b/fish/species/angelfish_freshwater/angelfish_freshwater.tres new file mode 100644 index 0000000..5d9bda2 --- /dev/null +++ b/fish/species/angelfish_freshwater/angelfish_freshwater.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"angelfish_freshwater" +display_name = "freshwater angelfish" +active = false +catalog_number = 7504 +collection_group = &"Tropical freshwater fish" +logbook_fact = "freshwater angelfish slip between tall plants on narrow triangular bodies. long fins and vertical bars resemble stems and shadows." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.5 +sell_value_min = 10 +sell_value_max = 22 +sell_value_curve = 0.95 diff --git a/fish/species/angelfish_queen/angelfish_queen.tres b/fish/species/angelfish_queen/angelfish_queen.tres new file mode 100644 index 0000000..d45bbea --- /dev/null +++ b/fish/species/angelfish_queen/angelfish_queen.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"angelfish_queen" +display_name = "queen angelfish" +active = false +catalog_number = 5703 +collection_group = &"Reef ornamentals" +logbook_fact = "queen angelfish graze sponges from warm atlantic reefs. a blue-ringed spot on the forehead resembles a tiny crown." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 2.0 +sell_value_min = 11 +sell_value_max = 25 +sell_value_curve = 0.94 diff --git a/fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres b/fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres new file mode 100644 index 0000000..2888120 --- /dev/null +++ b/fish/species/anglerfish_black_seadevil/anglerfish_black_seadevil.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"anglerfish_black_seadevil" +display_name = "black seadevil" +active = false +catalog_number = 1801 +collection_group = &"Deep-sea oddities" +logbook_fact = "black seadevils lure prey with a glowing organ suspended above the mouth. tiny males permanently attach to much larger females." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.05 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 2.0 +sell_value_min = 48 +sell_value_max = 105 +sell_value_curve = 0.92 diff --git a/fish/species/arapaima/arapaima.tres b/fish/species/arapaima/arapaima.tres new file mode 100644 index 0000000..2ee2c75 --- /dev/null +++ b/fish/species/arapaima/arapaima.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"arapaima" +display_name = "arapaima" +active = false +catalog_number = 2702 +collection_group = &"Freshwater giants" +logbook_fact = "arapaima must surface frequently to gulp air through a specialized swim bladder. large armored scales protect their long river-going bodies." +allowed_water_types = 1 +rarity = 4 +base_catch_weight = 0.04 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 40.0 +weight_max_lb = 400.0 +sell_value_min = 60 +sell_value_max = 140 +sell_value_curve = 0.78 diff --git a/fish/species/arowana_silver/arowana_silver.tres b/fish/species/arowana_silver/arowana_silver.tres new file mode 100644 index 0000000..413621c --- /dev/null +++ b/fish/species/arowana_silver/arowana_silver.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"arowana_silver" +display_name = "silver arowana" +active = false +catalog_number = 7606 +collection_group = &"Tropical freshwater predators" +logbook_fact = "silver arowanas patrol the surface with upturned mouths and long bodies. powerful jumps capture insects and small animals above the water." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.11 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 15.0 +sell_value_min = 25 +sell_value_max = 56 +sell_value_curve = 0.86 diff --git a/fish/species/axolotl/axolotl.tres b/fish/species/axolotl/axolotl.tres new file mode 100644 index 0000000..17ba5ad --- /dev/null +++ b/fish/species/axolotl/axolotl.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"axolotl" +display_name = "axolotl" +active = false +catalog_number = 2001 +collection_group = &"Freshwater amphibians" +logbook_fact = "axolotls remain aquatic and keep feathery external gills throughout adulthood. lost limbs and parts of several organs can regenerate." +allowed_water_types = 1 +rarity = 4 +base_catch_weight = 0.04 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 0.7 +sell_value_min = 36 +sell_value_max = 78 +sell_value_curve = 0.96 diff --git a/fish/species/barbel_common/barbel_common.tres b/fish/species/barbel_common/barbel_common.tres new file mode 100644 index 0000000..4e1b93d --- /dev/null +++ b/fish/species/barbel_common/barbel_common.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"barbel_common" +display_name = "common barbel" +active = false +catalog_number = 2501 +collection_group = &"Freshwater coarse fish" +logbook_fact = "common barbels hold close to fast river bottoms with streamlined bodies and broad fins. four mouth barbels locate food among stones." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 25.0 +sell_value_min = 13 +sell_value_max = 31 +sell_value_curve = 0.85 diff --git a/fish/species/barracuda_great/barracuda_great.tres b/fish/species/barracuda_great/barracuda_great.tres new file mode 100644 index 0000000..c2a105f --- /dev/null +++ b/fish/species/barracuda_great/barracuda_great.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"barracuda_great" +display_name = "great barracuda" +active = false +catalog_number = 5804 +collection_group = &"Reef predators" +logbook_fact = "great barracudas hover motionless before accelerating toward prey. long jaws carry two distinct rows of sharp teeth." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.12 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 80.0 +sell_value_min = 28 +sell_value_max = 65 +sell_value_curve = 0.82 diff --git a/fish/species/barramundi/barramundi.tres b/fish/species/barramundi/barramundi.tres new file mode 100644 index 0000000..afbd336 --- /dev/null +++ b/fish/species/barramundi/barramundi.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"barramundi" +display_name = "barramundi" +active = false +catalog_number = 7302 +collection_group = &"Tropical estuary" +logbook_fact = "barramundi move between rivers and coasts and can breathe in low-oxygen water. many mature first as males and later become females." +allowed_water_types = 3 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 45.0 +sell_value_min = 15 +sell_value_max = 38 +sell_value_curve = 0.84 diff --git a/fish/species/barreleye_pacific/barreleye_pacific.tres b/fish/species/barreleye_pacific/barreleye_pacific.tres new file mode 100644 index 0000000..d784c35 --- /dev/null +++ b/fish/species/barreleye_pacific/barreleye_pacific.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"barreleye_pacific" +display_name = "Pacific barreleye" +active = false +catalog_number = 1804 +collection_group = &"Deep-sea oddities" +logbook_fact = "pacific barreleyes peer upward through transparent shields covering the head. tubular eyes rotate forward when the fish turns to feed." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.045 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 2.5 +sell_value_min = 42 +sell_value_max = 88 +sell_value_curve = 0.9 diff --git a/fish/species/bass/bass.tres b/fish/species/bass/bass.tres index bc2b026..b263c3f 100644 --- a/fish/species/bass/bass.tres +++ b/fish/species/bass/bass.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"bass" display_name = "striped bass" +active = true +catalog_number = 6701 +collection_group = &"Temperate coastal" +logbook_fact = "striped bass split their lives between salt and fresh water, returning upriver to spawn. a long-lived striper may see three decades." allowed_water_types = 2 rarity = 1 base_catch_weight = 4.0 diff --git a/fish/species/betta_siamese/betta_siamese.tres b/fish/species/betta_siamese/betta_siamese.tres new file mode 100644 index 0000000..06bbac6 --- /dev/null +++ b/fish/species/betta_siamese/betta_siamese.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"betta_siamese" +display_name = "Siamese fighting fish" +active = false +catalog_number = 7508 +collection_group = &"Tropical freshwater fish" +logbook_fact = "siamese fighting fish breathe surface air with a labyrinth organ. males build bubble nests and guard the eggs beneath them." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 1.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.01 +weight_max_lb = 0.15 +sell_value_min = 5 +sell_value_max = 10 +sell_value_curve = 1.0 diff --git a/fish/species/black_drum/black_drum.tres b/fish/species/black_drum/black_drum.tres new file mode 100644 index 0000000..88a4ee2 --- /dev/null +++ b/fish/species/black_drum/black_drum.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"black_drum" +display_name = "black drum" +active = false +catalog_number = 6802 +collection_group = &"Temperate estuary" +logbook_fact = "black drum crush oysters and crabs with rounded throat teeth. large adults develop dark vertical bars that fade with age." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 70.0 +sell_value_min = 8 +sell_value_max = 27 +sell_value_curve = 0.82 diff --git a/fish/species/blobfish_smooth_head/blobfish_smooth_head.tres b/fish/species/blobfish_smooth_head/blobfish_smooth_head.tres new file mode 100644 index 0000000..0117988 --- /dev/null +++ b/fish/species/blobfish_smooth_head/blobfish_smooth_head.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"blobfish_smooth_head" +display_name = "smooth-head blobfish" +active = false +catalog_number = 1805 +collection_group = &"Deep-sea oddities" +logbook_fact = "smooth-head blobfish rest on deep slopes where pressure supports their soft bodies. they conserve energy by waiting for edible matter nearby." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.04 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 5.0 +sell_value_min = 42 +sell_value_max = 90 +sell_value_curve = 0.86 diff --git a/fish/species/bluefish/bluefish.tres b/fish/species/bluefish/bluefish.tres new file mode 100644 index 0000000..70288f5 --- /dev/null +++ b/fish/species/bluefish/bluefish.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"bluefish" +display_name = "bluefish" +active = false +catalog_number = 702 +collection_group = &"Coastal pelagic fish" +logbook_fact = "bluefish race in coordinated schools while pursuing smaller fish. sharp teeth and powerful jaws make their feeding bursts especially fierce." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.85 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 25.0 +sell_value_min = 7 +sell_value_max = 19 +sell_value_curve = 0.85 diff --git a/fish/species/bluegill/bluegill.tres b/fish/species/bluegill/bluegill.tres index 9e98a5b..04c03d0 100644 --- a/fish/species/bluegill/bluegill.tres +++ b/fish/species/bluegill/bluegill.tres @@ -9,6 +9,10 @@ script = ExtResource("1_fish_data") id = &"bluegill" display_name = "bluegill" +active = true +catalog_number = 3102 +collection_group = &"Freshwater panfish" +logbook_fact = "bluegill fathers sweep shallow bowls into the bottom for nests, then stand guard. whole neighborhoods of nests can crowd together." allowed_water_types = 1 rarity = 0 base_catch_weight = 10.0 diff --git a/fish/species/bonefish/bonefish.tres b/fish/species/bonefish/bonefish.tres new file mode 100644 index 0000000..0c0d6dd --- /dev/null +++ b/fish/species/bonefish/bonefish.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"bonefish" +display_name = "bonefish" +active = false +catalog_number = 7401 +collection_group = &"Tropical flats fish" +logbook_fact = "bonefish sweep tropical flats in silvery schools and root for buried prey. their speed and pale bodies make them difficult to follow in shallow water." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 15.0 +sell_value_min = 13 +sell_value_max = 31 +sell_value_curve = 0.86 diff --git a/fish/species/bowfin/bowfin.tres b/fish/species/bowfin/bowfin.tres new file mode 100644 index 0000000..748197a --- /dev/null +++ b/fish/species/bowfin/bowfin.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"bowfin" +display_name = "bowfin" +active = false +catalog_number = 101 +collection_group = &"Ancient freshwater fish" +logbook_fact = "bowfin can gulp air at the surface when warm backwaters run low on oxygen. a long dorsal fin ripples as they stalk prey." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 20.0 +sell_value_min = 13 +sell_value_max = 30 +sell_value_curve = 0.85 diff --git a/fish/species/boxfish_yellow/boxfish_yellow.tres b/fish/species/boxfish_yellow/boxfish_yellow.tres new file mode 100644 index 0000000..d701ada --- /dev/null +++ b/fish/species/boxfish_yellow/boxfish_yellow.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"boxfish_yellow" +display_name = "yellow boxfish" +active = false +catalog_number = 5608 +collection_group = &"Reef oddities" +logbook_fact = "yellow boxfish juveniles are bright cubes covered in black spots. rigid body armor leaves small fins to provide careful steering." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.32 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.03 +weight_max_lb = 0.8 +sell_value_min = 10 +sell_value_max = 22 +sell_value_curve = 0.96 diff --git a/fish/species/bream_common/bream_common.tres b/fish/species/bream_common/bream_common.tres new file mode 100644 index 0000000..54ecc57 --- /dev/null +++ b/fish/species/bream_common/bream_common.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"bream_common" +display_name = "common bream" +active = false +catalog_number = 2502 +collection_group = &"Freshwater coarse fish" +logbook_fact = "common bream gather in slow rivers and lakes with silvery, deep-sided bodies. protruding mouths sift insect larvae from soft bottoms." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 1.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 15.0 +sell_value_min = 4 +sell_value_max = 12 +sell_value_curve = 0.88 diff --git a/fish/species/buffalo_bigmouth/buffalo_bigmouth.tres b/fish/species/buffalo_bigmouth/buffalo_bigmouth.tres new file mode 100644 index 0000000..4053eb6 --- /dev/null +++ b/fish/species/buffalo_bigmouth/buffalo_bigmouth.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"buffalo_bigmouth" +display_name = "bigmouth buffalo" +active = false +catalog_number = 2301 +collection_group = &"Freshwater bottom fish" +logbook_fact = "bigmouth buffalo filter plankton with fine gill rakers instead of rooting for prey. some individuals survive for more than a century." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.12 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 8.0 +weight_max_lb = 80.0 +sell_value_min = 28 +sell_value_max = 63 +sell_value_curve = 0.82 diff --git a/fish/species/buffalo_smallmouth/buffalo_smallmouth.tres b/fish/species/buffalo_smallmouth/buffalo_smallmouth.tres new file mode 100644 index 0000000..f0d2780 --- /dev/null +++ b/fish/species/buffalo_smallmouth/buffalo_smallmouth.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"buffalo_smallmouth" +display_name = "smallmouth buffalo" +active = false +catalog_number = 2304 +collection_group = &"Freshwater bottom fish" +logbook_fact = "smallmouth buffalo use thick lips to graze bottom-dwelling food in warm rivers. their deep, heavy bodies form a pronounced arch behind the head." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 3.0 +weight_max_lb = 45.0 +sell_value_min = 14 +sell_value_max = 34 +sell_value_curve = 0.84 diff --git a/fish/species/bullhead_black/bullhead_black.tres b/fish/species/bullhead_black/bullhead_black.tres new file mode 100644 index 0000000..87f6155 --- /dev/null +++ b/fish/species/bullhead_black/bullhead_black.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"bullhead_black" +display_name = "black bullhead" +active = false +catalog_number = 2401 +collection_group = &"Freshwater catfish" +logbook_fact = "black bullheads tolerate warm, cloudy water with little oxygen. stout spines protect the dorsal and pectoral fins from predators." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 1.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 6.0 +sell_value_min = 5 +sell_value_max = 11 +sell_value_curve = 0.92 diff --git a/fish/species/bullhead_brown/bullhead_brown.tres b/fish/species/bullhead_brown/bullhead_brown.tres new file mode 100644 index 0000000..c900d5f --- /dev/null +++ b/fish/species/bullhead_brown/bullhead_brown.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"bullhead_brown" +display_name = "brown bullhead" +active = false +catalog_number = 2403 +collection_group = &"Freshwater catfish" +logbook_fact = "brown bullheads search muddy bottoms with eight sensitive barbels. males guard nests and herd newly hatched young in a dark moving ball." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 4.0 +sell_value_min = 3 +sell_value_max = 7 +sell_value_curve = 0.95 diff --git a/fish/species/bullhead_yellow/bullhead_yellow.tres b/fish/species/bullhead_yellow/bullhead_yellow.tres new file mode 100644 index 0000000..e2b5d63 --- /dev/null +++ b/fish/species/bullhead_yellow/bullhead_yellow.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"bullhead_yellow" +display_name = "yellow bullhead" +active = false +catalog_number = 2408 +collection_group = &"Freshwater catfish" +logbook_fact = "yellow bullheads use pale chin barbels to distinguish food in murky shallows. both parents may guard the nest and schooling young." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 3.5 +sell_value_min = 3 +sell_value_max = 7 +sell_value_curve = 0.95 diff --git a/fish/species/burbot/burbot.tres b/fish/species/burbot/burbot.tres new file mode 100644 index 0000000..25e9277 --- /dev/null +++ b/fish/species/burbot/burbot.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"burbot" +display_name = "burbot" +active = false +catalog_number = 1001 +collection_group = &"Cold freshwater fish" +logbook_fact = "burbot are the only freshwater members of the cod family. they become most active in cold darkness and may spawn beneath winter ice." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 18.0 +sell_value_min = 12 +sell_value_max = 28 +sell_value_curve = 0.86 diff --git a/fish/species/butterflyfish_copperband/butterflyfish_copperband.tres b/fish/species/butterflyfish_copperband/butterflyfish_copperband.tres new file mode 100644 index 0000000..e9a3385 --- /dev/null +++ b/fish/species/butterflyfish_copperband/butterflyfish_copperband.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"butterflyfish_copperband" +display_name = "copperband butterflyfish" +active = false +catalog_number = 5701 +collection_group = &"Reef ornamentals" +logbook_fact = "copperband butterflyfish probe reef cracks with long narrow snouts. bold orange bands and a false eyespot confuse predators." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.32 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.03 +weight_max_lb = 0.4 +sell_value_min = 9 +sell_value_max = 21 +sell_value_curve = 0.98 diff --git a/fish/species/capelin/capelin.tres b/fish/species/capelin/capelin.tres new file mode 100644 index 0000000..0e5f25b --- /dev/null +++ b/fish/species/capelin/capelin.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"capelin" +display_name = "capelin" +active = false +catalog_number = 1302 +collection_group = &"Cold schooling fish" +logbook_fact = "capelin are small polar fish that feed whales, seabirds, and larger fish. many schools roll onto beaches or shallows to release their eggs." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 1.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.03 +weight_max_lb = 0.2 +sell_value_min = 4 +sell_value_max = 8 +sell_value_curve = 1.0 diff --git a/fish/species/carp/carp.tres b/fish/species/carp/carp.tres index 5673834..4bcdb6c 100644 --- a/fish/species/carp/carp.tres +++ b/fish/species/carp/carp.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.5 script = ExtResource("1_fish_data") id = &"carp" display_name = "common carp" +active = true +catalog_number = 2503 +collection_group = &"Freshwater coarse fish" +logbook_fact = "whisker-like barbels help a common carp investigate the bottom. nosing through sediment can cloud the water and loosen plants." allowed_water_types = 1 rarity = 2 base_catch_weight = 1.5 diff --git a/fish/species/catfish_blue/catfish_blue.tres b/fish/species/catfish_blue/catfish_blue.tres index 482520a..98fda16 100644 --- a/fish/species/catfish_blue/catfish_blue.tres +++ b/fish/species/catfish_blue/catfish_blue.tres @@ -16,6 +16,10 @@ preferred_bait_weight_multiplier = 1.35 script = ExtResource("1_fish_data") id = &"catfish_blue" display_name = "blue catfish" +active = true +catalog_number = 2402 +collection_group = &"Freshwater catfish" +logbook_fact = "a deep fork in the tail inspired the blue catfish's scientific name. it rests deep by daylight and becomes more active after dark." allowed_water_types = 1 rarity = 1 base_catch_weight = 1.25 diff --git a/fish/species/catfish_channel/catfish_channel.tres b/fish/species/catfish_channel/catfish_channel.tres index 265daad..69aff97 100644 --- a/fish/species/catfish_channel/catfish_channel.tres +++ b/fish/species/catfish_channel/catfish_channel.tres @@ -16,6 +16,10 @@ preferred_bait_weight_multiplier = 1.35 script = ExtResource("1_fish_data") id = &"catfish_channel" display_name = "channel catfish" +active = true +catalog_number = 2404 +collection_group = &"Freshwater catfish" +logbook_fact = "a channel catfish can taste through skin all over its body, especially near its gills and whiskers. the male watches the eggs." allowed_water_types = 1 base_catch_weight = 2.0 catch_profile = ExtResource("2_profile") diff --git a/fish/species/catfish_flathead/catfish_flathead.tres b/fish/species/catfish_flathead/catfish_flathead.tres index 651359a..84a6f01 100644 --- a/fish/species/catfish_flathead/catfish_flathead.tres +++ b/fish/species/catfish_flathead/catfish_flathead.tres @@ -16,6 +16,10 @@ preferred_bait_weight_multiplier = 1.35 script = ExtResource("1_fish_data") id = &"catfish_flathead" display_name = "flathead catfish" +active = true +catalog_number = 2405 +collection_group = &"Freshwater catfish" +logbook_fact = "flatheads favor hideouts made by logs, rocks, ledges, and other underwater structure. as they grow, fish dominate their menu." allowed_water_types = 1 rarity = 1 catch_profile = ExtResource("2_profile") diff --git a/fish/species/catfish_walking/catfish_walking.tres b/fish/species/catfish_walking/catfish_walking.tres new file mode 100644 index 0000000..7b8dbf4 --- /dev/null +++ b/fish/species/catfish_walking/catfish_walking.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"catfish_walking" +display_name = "walking catfish" +active = false +catalog_number = 7510 +collection_group = &"Tropical freshwater fish" +logbook_fact = "walking catfish wriggle across wet ground using stiff pectoral spines for support. an air-breathing organ helps them survive the journey." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 5.0 +sell_value_min = 11 +sell_value_max = 24 +sell_value_curve = 0.9 diff --git a/fish/species/catfish_white/catfish_white.tres b/fish/species/catfish_white/catfish_white.tres index 6ee72ea..e5cc545 100644 --- a/fish/species/catfish_white/catfish_white.tres +++ b/fish/species/catfish_white/catfish_white.tres @@ -16,6 +16,10 @@ preferred_bait_weight_multiplier = 1.35 script = ExtResource("1_fish_data") id = &"catfish_white" display_name = "white catfish" +active = true +catalog_number = 2407 +collection_group = &"Freshwater catfish" +logbook_fact = "white catfish began along the atlantic coast between new york and florida. people later carried them far beyond that home range." allowed_water_types = 1 base_catch_weight = 2.0 catch_profile = ExtResource("2_profile") diff --git a/fish/species/char_arctic/char_arctic.tres b/fish/species/char_arctic/char_arctic.tres new file mode 100644 index 0000000..cb47137 --- /dev/null +++ b/fish/species/char_arctic/char_arctic.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +forbid_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"char_arctic" +display_name = "arctic char" +active = false +catalog_number = 1101 +collection_group = &"Cold freshwater salmonids" +logbook_fact = "arctic char thrive farther north than any other freshwater fish. some remain in lakes while others migrate between rivers and the sea." +allowed_water_types = 3 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 25.0 +sell_value_min = 14 +sell_value_max = 32 +sell_value_curve = 0.86 diff --git a/fish/species/chromis_blue_green/chromis_blue_green.tres b/fish/species/chromis_blue_green/chromis_blue_green.tres new file mode 100644 index 0000000..e02ded5 --- /dev/null +++ b/fish/species/chromis_blue_green/chromis_blue_green.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"chromis_blue_green" +display_name = "blue-green chromis" +active = false +catalog_number = 5901 +collection_group = &"Reef schooling fish" +logbook_fact = "blue-green chromis form loose clouds above branching coral. the school dives into narrow shelter whenever a predator approaches." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.01 +weight_max_lb = 0.25 +sell_value_min = 2 +sell_value_max = 4 +sell_value_curve = 1.0 diff --git a/fish/species/chub_creek/chub_creek.tres b/fish/species/chub_creek/chub_creek.tres new file mode 100644 index 0000000..e2bda01 --- /dev/null +++ b/fish/species/chub_creek/chub_creek.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"chub_creek" +display_name = "creek chub" +active = false +catalog_number = 2802 +collection_group = &"Freshwater minnows" +logbook_fact = "creek chubs gather around pools and undercut banks in small streams. males build gravel ridges where several fish may spawn." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 3.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.8 +sell_value_min = 2 +sell_value_max = 4 +sell_value_curve = 1.0 diff --git a/fish/species/chub_european/chub_european.tres b/fish/species/chub_european/chub_european.tres index e282b90..aeed2b7 100644 --- a/fish/species/chub_european/chub_european.tres +++ b/fish/species/chub_european/chub_european.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"chub_european" display_name = "european chub" +active = true +catalog_number = 2505 +collection_group = &"Freshwater coarse fish" +logbook_fact = "european chub are adaptable river fish. adults often patrol shallows and feed on insects, small fish, and fruit." allowed_water_types = 1 base_catch_weight = 0.55 catch_profile = ExtResource("2_profile") diff --git a/fish/species/chub_flame/chub_flame.tres b/fish/species/chub_flame/chub_flame.tres index d631ab0..4ca30fe 100644 --- a/fish/species/chub_flame/chub_flame.tres +++ b/fish/species/chub_flame/chub_flame.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"chub_flame" display_name = "flame chub" +active = true +catalog_number = 2805 +collection_group = &"Freshwater minnows" +logbook_fact = "flame chubs prefer cool, clear streams. their bright breeding colors make a small fish easy to spot in spring water." allowed_water_types = 1 rarity = 1 base_catch_weight = 0.4 diff --git a/fish/species/chub_lake/chub_lake.tres b/fish/species/chub_lake/chub_lake.tres index c04c5b3..8b8927f 100644 --- a/fish/species/chub_lake/chub_lake.tres +++ b/fish/species/chub_lake/chub_lake.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"chub_lake" display_name = "lake chub" +active = true +catalog_number = 2807 +collection_group = &"Freshwater minnows" +logbook_fact = "lake chubs school in cold northern water and use their small mouths to pick insects and other tiny prey from the current." allowed_water_types = 1 base_catch_weight = 0.55 catch_profile = ExtResource("2_profile") diff --git a/fish/species/cisco/cisco.tres b/fish/species/cisco/cisco.tres new file mode 100644 index 0000000..694a9ec --- /dev/null +++ b/fish/species/cisco/cisco.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"cisco" +display_name = "cisco" +active = false +catalog_number = 1002 +collection_group = &"Cold freshwater fish" +logbook_fact = "cisco school in the cool open water of northern lakes. these slim relatives of salmon feed on plankton and become prey for larger fish." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 3.0 +sell_value_min = 3 +sell_value_max = 7 +sell_value_curve = 0.95 diff --git a/fish/species/clam_geoduck/clam_geoduck.tres b/fish/species/clam_geoduck/clam_geoduck.tres new file mode 100644 index 0000000..82c8eac --- /dev/null +++ b/fish/species/clam_geoduck/clam_geoduck.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"clam_geoduck" +display_name = "Pacific geoduck" +active = false +catalog_number = 6403 +collection_group = &"Shellfish" +logbook_fact = "pacific geoducks bury their shells deep while a long siphon reaches the seafloor. these clams can survive for well over a century." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 15.0 +sell_value_min = 14 +sell_value_max = 34 +sell_value_curve = 0.88 diff --git a/fish/species/clam_giant/clam_giant.tres b/fish/species/clam_giant/clam_giant.tres new file mode 100644 index 0000000..d56f410 --- /dev/null +++ b/fish/species/clam_giant/clam_giant.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"clam_giant" +display_name = "giant clam" +active = false +catalog_number = 6402 +collection_group = &"Shellfish" +logbook_fact = "giant clams host photosynthetic algae inside brightly colored mantles. heavy shells remain anchored to one reef spot throughout adulthood." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 500.0 +sell_value_min = 28 +sell_value_max = 72 +sell_value_curve = 0.8 diff --git a/fish/species/clownfish_ocellaris/clownfish_ocellaris.tres b/fish/species/clownfish_ocellaris/clownfish_ocellaris.tres new file mode 100644 index 0000000..b09dbdb --- /dev/null +++ b/fish/species/clownfish_ocellaris/clownfish_ocellaris.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"clownfish_ocellaris" +display_name = "ocellaris clownfish" +active = false +catalog_number = 5702 +collection_group = &"Reef ornamentals" +logbook_fact = "ocellaris clownfish shelter safely among stinging anemone tentacles. each group is led by a female that develops from the largest male." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 1.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.01 +weight_max_lb = 0.15 +sell_value_min = 5 +sell_value_max = 10 +sell_value_curve = 1.0 diff --git a/fish/species/cobia/cobia.tres b/fish/species/cobia/cobia.tres new file mode 100644 index 0000000..885f55a --- /dev/null +++ b/fish/species/cobia/cobia.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"cobia" +display_name = "cobia" +active = false +catalog_number = 3602 +collection_group = &"Large coastal predators" +logbook_fact = "cobia often follow sharks, rays, and floating structures in warm seas. a broad dark stripe runs along their long, powerful bodies." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 80.0 +sell_value_min = 15 +sell_value_max = 40 +sell_value_curve = 0.82 diff --git a/fish/species/cod_atlantic/cod_atlantic.tres b/fish/species/cod_atlantic/cod_atlantic.tres new file mode 100644 index 0000000..22ee1ca --- /dev/null +++ b/fish/species/cod_atlantic/cod_atlantic.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"cod_atlantic" +display_name = "atlantic cod" +active = false +catalog_number = 1402 +collection_group = &"Cold shelf fish" +logbook_fact = "atlantic cod carry a pale lateral line and one chin barbel. they search cold seafloors for crustaceans, mollusks, and smaller fish." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 55.0 +sell_value_min = 5 +sell_value_max = 18 +sell_value_curve = 0.85 diff --git a/fish/species/cod_pacific/cod_pacific.tres b/fish/species/cod_pacific/cod_pacific.tres new file mode 100644 index 0000000..7f0b8ce --- /dev/null +++ b/fish/species/cod_pacific/cod_pacific.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"cod_pacific" +display_name = "pacific cod" +active = false +catalog_number = 1406 +collection_group = &"Cold shelf fish" +logbook_fact = "pacific cod use a chin barbel to investigate cold shelf bottoms. seasonal schools follow prey between deeper water and coastal spawning grounds." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 45.0 +sell_value_min = 5 +sell_value_max = 17 +sell_value_curve = 0.85 diff --git a/fish/species/coelacanth_west_indian/coelacanth_west_indian.tres b/fish/species/coelacanth_west_indian/coelacanth_west_indian.tres new file mode 100644 index 0000000..fafc161 --- /dev/null +++ b/fish/species/coelacanth_west_indian/coelacanth_west_indian.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"coelacanth_west_indian" +display_name = "West Indian Ocean coelacanth" +active = false +catalog_number = 1702 +collection_group = &"Deep-sea legends" +logbook_fact = "west indian ocean coelacanths shelter in deep volcanic caves by day. fleshy lobed fins move in an alternating, limb-like rhythm." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.03 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 20.0 +weight_max_lb = 200.0 +sell_value_min = 65 +sell_value_max = 145 +sell_value_curve = 0.8 diff --git a/fish/species/conch_queen/conch_queen.tres b/fish/species/conch_queen/conch_queen.tres new file mode 100644 index 0000000..0868ddf --- /dev/null +++ b/fish/species/conch_queen/conch_queen.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"conch_queen" +display_name = "queen conch" +active = false +catalog_number = 6404 +collection_group = &"Shellfish" +logbook_fact = "queen conchs graze algae with a long flexible snout. adults develop a broad flared shell lip and move by vaulting on one muscular foot." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 5.0 +sell_value_min = 15 +sell_value_max = 36 +sell_value_curve = 0.91 diff --git a/fish/species/cornetfish_red/cornetfish_red.tres b/fish/species/cornetfish_red/cornetfish_red.tres new file mode 100644 index 0000000..fe4fbc9 --- /dev/null +++ b/fish/species/cornetfish_red/cornetfish_red.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"cornetfish_red" +display_name = "red cornetfish" +active = false +catalog_number = 5606 +collection_group = &"Reef oddities" +logbook_fact = "red cornetfish stalk reefs with extremely long bodies and tubular snouts. a trailing filament extends from the center of the tail." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.11 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 4.0 +sell_value_min = 24 +sell_value_max = 55 +sell_value_curve = 0.92 diff --git a/fish/species/cowfish_longhorn/cowfish_longhorn.tres b/fish/species/cowfish_longhorn/cowfish_longhorn.tres new file mode 100644 index 0000000..2f647cc --- /dev/null +++ b/fish/species/cowfish_longhorn/cowfish_longhorn.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"cowfish_longhorn" +display_name = "longhorn cowfish" +active = false +catalog_number = 5604 +collection_group = &"Reef oddities" +logbook_fact = "longhorn cowfish wear a rigid box of fused scales with horns above the eyes. small fins steer the angular body with surprising precision." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.13 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 2.0 +sell_value_min = 23 +sell_value_max = 52 +sell_value_curve = 0.94 diff --git a/fish/species/crab_blue/crab_blue.tres b/fish/species/crab_blue/crab_blue.tres new file mode 100644 index 0000000..2248f78 --- /dev/null +++ b/fish/species/crab_blue/crab_blue.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"crab_blue" +display_name = "blue crab" +active = false +catalog_number = 3902 +collection_group = &"Marine crabs" +logbook_fact = "blue crabs swim with flattened rear legs shaped like paddles. bright blue claws and an olive shell conceal a quick, defensive temperament." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.15 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 1.1 +sell_value_min = 3 +sell_value_max = 8 +sell_value_curve = 0.95 diff --git a/fish/species/crab_dungeness/crab_dungeness.tres b/fish/species/crab_dungeness/crab_dungeness.tres new file mode 100644 index 0000000..6a75ee3 --- /dev/null +++ b/fish/species/crab_dungeness/crab_dungeness.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"crab_dungeness" +display_name = "Dungeness crab" +active = false +catalog_number = 3903 +collection_group = &"Marine crabs" +logbook_fact = "dungeness crabs bury beneath sand with only their eyes and antennae exposed. broad toothed shells protect them along cool pacific coasts." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.65 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 3.0 +sell_value_min = 6 +sell_value_max = 14 +sell_value_curve = 0.92 diff --git a/fish/species/crab_ghost/crab_ghost.tres b/fish/species/crab_ghost/crab_ghost.tres new file mode 100644 index 0000000..5713645 --- /dev/null +++ b/fish/species/crab_ghost/crab_ghost.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"crab_ghost" +display_name = "Atlantic ghost crab" +active = false +catalog_number = 3901 +collection_group = &"Marine crabs" +logbook_fact = "atlantic ghost crabs dash across beaches on long pale legs and retreat into deep burrows. raised eyes scan nearly every direction." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.02 +weight_max_lb = 0.5 +sell_value_min = 11 +sell_value_max = 24 +sell_value_curve = 0.97 diff --git a/fish/species/crab_japanese_spider/crab_japanese_spider.tres b/fish/species/crab_japanese_spider/crab_japanese_spider.tres new file mode 100644 index 0000000..e045021 --- /dev/null +++ b/fish/species/crab_japanese_spider/crab_japanese_spider.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"crab_japanese_spider" +display_name = "Japanese spider crab" +active = false +catalog_number = 3904 +collection_group = &"Marine crabs" +logbook_fact = "japanese spider crabs carry the longest leg span of any living arthropod. adults roam deep seafloors around japan." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.045 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 44.0 +sell_value_min = 38 +sell_value_max = 88 +sell_value_curve = 0.84 diff --git a/fish/species/crab_red_king/crab_red_king.tres b/fish/species/crab_red_king/crab_red_king.tres new file mode 100644 index 0000000..d0b8a74 --- /dev/null +++ b/fish/species/crab_red_king/crab_red_king.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"crab_red_king" +display_name = "red king crab" +active = false +catalog_number = 3905 +collection_group = &"Marine crabs" +logbook_fact = "red king crabs stride over cold northern bottoms on long armored legs. despite the name, they are closer to hermit crabs than true crabs." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.11 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 24.0 +sell_value_min = 24 +sell_value_max = 58 +sell_value_curve = 0.85 diff --git a/fish/species/crappie_black/crappie_black.tres b/fish/species/crappie_black/crappie_black.tres new file mode 100644 index 0000000..ba6956e --- /dev/null +++ b/fish/species/crappie_black/crappie_black.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"crappie_black" +display_name = "black crappie" +active = false +catalog_number = 3101 +collection_group = &"Freshwater panfish" +logbook_fact = "black crappie gather around submerged wood and vegetation in clear water. irregular dark speckles scatter across their deep silver bodies." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 1.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 4.0 +sell_value_min = 5 +sell_value_max = 11 +sell_value_curve = 0.9 diff --git a/fish/species/crappie_white/crappie_white.tres b/fish/species/crappie_white/crappie_white.tres new file mode 100644 index 0000000..85c22b0 --- /dev/null +++ b/fish/species/crappie_white/crappie_white.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"crappie_white" +display_name = "white crappie" +active = false +catalog_number = 3107 +collection_group = &"Freshwater panfish" +logbook_fact = "white crappie favor warm, cloudy water and gather around structure. vertical bars cross their silver sides instead of scattered speckles." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 1.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 4.5 +sell_value_min = 4 +sell_value_max = 9 +sell_value_curve = 0.9 diff --git a/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres b/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres new file mode 100644 index 0000000..cd9d6a0 --- /dev/null +++ b/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"crayfish_red_swamp" +display_name = "red swamp crayfish" +active = false +catalog_number = 2601 +collection_group = &"Freshwater crustaceans" +logbook_fact = "red swamp crayfish burrow into wet ground when water recedes. adaptable populations feed on plants, carrion, and small aquatic animals." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 1.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.03 +weight_max_lb = 0.25 +sell_value_min = 3 +sell_value_max = 7 +sell_value_curve = 0.98 diff --git a/fish/species/croaker_atlantic/croaker_atlantic.tres b/fish/species/croaker_atlantic/croaker_atlantic.tres new file mode 100644 index 0000000..2f4df70 --- /dev/null +++ b/fish/species/croaker_atlantic/croaker_atlantic.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"croaker_atlantic" +display_name = "atlantic croaker" +active = false +catalog_number = 6801 +collection_group = &"Temperate estuary" +logbook_fact = "atlantic croakers vibrate muscles against the swim bladder to make a croaking sound. chin barbels locate worms in sandy bays." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 5.0 +sell_value_min = 3 +sell_value_max = 8 +sell_value_curve = 0.92 diff --git a/fish/species/croaker_yellowfin/croaker_yellowfin.tres b/fish/species/croaker_yellowfin/croaker_yellowfin.tres new file mode 100644 index 0000000..ed5410d --- /dev/null +++ b/fish/species/croaker_yellowfin/croaker_yellowfin.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"croaker_yellowfin" +display_name = "yellowfin croaker" +active = false +catalog_number = 6807 +collection_group = &"Temperate estuary" +logbook_fact = "yellowfin croakers search sandy surf zones with a small chin barbel. internal muscles produce croaks and drumming calls." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 4.0 +sell_value_min = 3 +sell_value_max = 8 +sell_value_curve = 0.92 diff --git a/fish/species/cusk/cusk.tres b/fish/species/cusk/cusk.tres new file mode 100644 index 0000000..c43b1b7 --- /dev/null +++ b/fish/species/cusk/cusk.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"cusk" +display_name = "cusk" +active = false +catalog_number = 1202 +collection_group = &"Cold reef fish" +logbook_fact = "cusk move slowly across cold rocky bottoms, sheltering in cracks and caves. a single long fin runs around much of the rear body." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.75 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 30.0 +sell_value_min = 7 +sell_value_max = 19 +sell_value_curve = 0.85 diff --git a/fish/species/cuttlefish_common/cuttlefish_common.tres b/fish/species/cuttlefish_common/cuttlefish_common.tres new file mode 100644 index 0000000..98ec8a0 --- /dev/null +++ b/fish/species/cuttlefish_common/cuttlefish_common.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"cuttlefish_common" +display_name = "common cuttlefish" +active = false +catalog_number = 1502 +collection_group = &"Cuttlefish and nautiluses" +logbook_fact = "common cuttlefish flash changing colors and patterns through specialized skin cells. an internal cuttlebone controls buoyancy." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.55 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 12.0 +sell_value_min = 7 +sell_value_max = 17 +sell_value_curve = 0.9 diff --git a/fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres b/fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres new file mode 100644 index 0000000..4c19554 --- /dev/null +++ b/fish/species/cuttlefish_flamboyant/cuttlefish_flamboyant.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"cuttlefish_flamboyant" +display_name = "flamboyant cuttlefish" +active = false +catalog_number = 1503 +collection_group = &"Cuttlefish and nautiluses" +logbook_fact = "flamboyant cuttlefish walk along the seafloor on their arms and fins. vivid displays warn predators of potent toxins." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.4 +sell_value_min = 26 +sell_value_max = 58 +sell_value_curve = 0.96 diff --git a/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres b/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres new file mode 100644 index 0000000..24260cf --- /dev/null +++ b/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"damselfish_sergeant_major" +display_name = "sergeant major" +active = false +catalog_number = 5904 +collection_group = &"Reef schooling fish" +logbook_fact = "sergeant majors guard purple egg patches on hard reef surfaces. five dark bars cross their yellow and silver bodies." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.02 +weight_max_lb = 0.5 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 0.98 diff --git a/fish/species/danio_zebra/danio_zebra.tres b/fish/species/danio_zebra/danio_zebra.tres new file mode 100644 index 0000000..72567d8 --- /dev/null +++ b/fish/species/danio_zebra/danio_zebra.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"danio_zebra" +display_name = "zebrafish" +active = false +catalog_number = 2103 +collection_group = &"Freshwater aquarium fish" +logbook_fact = "zebrafish carry horizontal blue stripes from gill to tail. hardy schools thrive in shallow streams, flooded fields, and quiet pools." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 1.35 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.01 +weight_max_lb = 0.12 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 0.98 diff --git a/fish/species/discus/discus.tres b/fish/species/discus/discus.tres new file mode 100644 index 0000000..4b84820 --- /dev/null +++ b/fish/species/discus/discus.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"discus" +display_name = "discus" +active = false +catalog_number = 7503 +collection_group = &"Tropical freshwater fish" +logbook_fact = "discus move through quiet amazon backwaters with round, flattened bodies. parents feed newly hatched young with nutrient-rich skin mucus." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.12 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 1.0 +sell_value_min = 24 +sell_value_max = 52 +sell_value_curve = 0.92 diff --git a/fish/species/dolphin_bottlenose/dolphin_bottlenose.tres b/fish/species/dolphin_bottlenose/dolphin_bottlenose.tres new file mode 100644 index 0000000..8d07e73 --- /dev/null +++ b/fish/species/dolphin_bottlenose/dolphin_bottlenose.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"dolphin_bottlenose" +display_name = "common bottlenose dolphin" +active = false +catalog_number = 7702 +collection_group = &"Whales and dolphins" +logbook_fact = "common bottlenose dolphins coordinate with whistles, clicks, and body signals. echolocation reveals prey hidden in dark or cloudy water." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.012 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 330.0 +weight_max_lb = 1400.0 +sell_value_min = 75 +sell_value_max = 180 +sell_value_curve = 0.76 diff --git a/fish/species/dorado_golden/dorado_golden.tres b/fish/species/dorado_golden/dorado_golden.tres new file mode 100644 index 0000000..c5f7abf --- /dev/null +++ b/fish/species/dorado_golden/dorado_golden.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"dorado_golden" +display_name = "golden dorado" +active = false +catalog_number = 7602 +collection_group = &"Tropical freshwater predators" +logbook_fact = "golden dorado chase fish through powerful south american rivers. muscular tails, heavy jaws, and golden scales suit life in fast current." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 55.0 +sell_value_min = 29 +sell_value_max = 66 +sell_value_curve = 0.82 diff --git a/fish/species/dugong/dugong.tres b/fish/species/dugong/dugong.tres new file mode 100644 index 0000000..d6c756d --- /dev/null +++ b/fish/species/dugong/dugong.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"dugong" +display_name = "dugong" +active = false +catalog_number = 501 +collection_group = &"Coastal marine mammals" +logbook_fact = "dugongs graze seagrass meadows with a downturned, bristled snout. they are the only fully marine members of the sirenian family." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.011 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 500.0 +weight_max_lb = 1100.0 +sell_value_min = 72 +sell_value_max = 165 +sell_value_curve = 0.77 diff --git a/fish/species/eel_american/eel_american.tres b/fish/species/eel_american/eel_american.tres new file mode 100644 index 0000000..54a671b --- /dev/null +++ b/fish/species/eel_american/eel_american.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"eel_american" +display_name = "american eel" +active = false +catalog_number = 4001 +collection_group = &"Migratory eels" +logbook_fact = "american eels hatch far out in the sargasso sea before entering freshwater rivers. adults later reverse the journey to spawn once." +allowed_water_types = 3 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 8.0 +sell_value_min = 12 +sell_value_max = 27 +sell_value_curve = 0.88 diff --git a/fish/species/eel_european/eel_european.tres b/fish/species/eel_european/eel_european.tres new file mode 100644 index 0000000..54a0c61 --- /dev/null +++ b/fish/species/eel_european/eel_european.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"eel_european" +display_name = "european eel" +active = false +catalog_number = 4002 +collection_group = &"Migratory eels" +logbook_fact = "european eels cross the atlantic as transparent larvae before entering rivers and lakes. mature silver eels return to sea to reproduce." +allowed_water_types = 3 +rarity = 2 +base_catch_weight = 0.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 10.0 +sell_value_min = 13 +sell_value_max = 30 +sell_value_curve = 0.88 diff --git a/fish/species/electric_eel/electric_eel.tres b/fish/species/electric_eel/electric_eel.tres new file mode 100644 index 0000000..cc63eea --- /dev/null +++ b/fish/species/electric_eel/electric_eel.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"electric_eel" +display_name = "electric eel" +active = false +catalog_number = 2901 +collection_group = &"Freshwater oddities" +logbook_fact = "electric eels navigate and hunt with electrical pulses produced along most of the body. they must surface regularly to breathe air." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 44.0 +sell_value_min = 25 +sell_value_max = 60 +sell_value_curve = 0.82 diff --git a/fish/species/fallfish/fallfish.tres b/fish/species/fallfish/fallfish.tres new file mode 100644 index 0000000..72e3774 --- /dev/null +++ b/fish/species/fallfish/fallfish.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"fallfish" +display_name = "fallfish" +active = false +catalog_number = 2506 +collection_group = &"Freshwater coarse fish" +logbook_fact = "fallfish are large minnows that build broad stone nests in flowing water. other stream fish often reuse the gravel mounds for spawning." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.9 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 3.5 +sell_value_min = 5 +sell_value_max = 10 +sell_value_curve = 0.92 diff --git a/fish/species/fangtooth_common/fangtooth_common.tres b/fish/species/fangtooth_common/fangtooth_common.tres new file mode 100644 index 0000000..e53e1ad --- /dev/null +++ b/fish/species/fangtooth_common/fangtooth_common.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"fangtooth_common" +display_name = "common fangtooth" +active = false +catalog_number = 1802 +collection_group = &"Deep-sea oddities" +logbook_fact = "common fangtooths carry outsized teeth that fit into pockets in the roof of the mouth. they migrate upward from deep water after dark." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.5 +sell_value_min = 25 +sell_value_max = 56 +sell_value_curve = 0.96 diff --git a/fish/species/flounder_peacock/flounder_peacock.tres b/fish/species/flounder_peacock/flounder_peacock.tres new file mode 100644 index 0000000..54737a4 --- /dev/null +++ b/fish/species/flounder_peacock/flounder_peacock.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"flounder_peacock" +display_name = "peacock flounder" +active = false +catalog_number = 5401 +collection_group = &"Reef flatfish" +logbook_fact = "peacock flounders change their spots and colors to match tropical sand. both eyes scan above while the flat body remains concealed." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 5.0 +sell_value_min = 11 +sell_value_max = 24 +sell_value_curve = 0.9 diff --git a/fish/species/flounder_summer/flounder_summer.tres b/fish/species/flounder_summer/flounder_summer.tres new file mode 100644 index 0000000..9d5892b --- /dev/null +++ b/fish/species/flounder_summer/flounder_summer.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"flounder_summer" +display_name = "summer flounder" +active = false +catalog_number = 402 +collection_group = &"Coastal flatfish" +logbook_fact = "summer flounder bury themselves in sand with only their eyes exposed. a sudden burst carries them upward to seize passing prey." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.9 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 15.0 +sell_value_min = 6 +sell_value_max = 16 +sell_value_curve = 0.88 diff --git a/fish/species/flounder_winter/flounder_winter.tres b/fish/species/flounder_winter/flounder_winter.tres new file mode 100644 index 0000000..6ad7a4b --- /dev/null +++ b/fish/species/flounder_winter/flounder_winter.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"flounder_winter" +display_name = "winter flounder" +active = false +catalog_number = 403 +collection_group = &"Coastal flatfish" +logbook_fact = "winter flounder favor cool bays and estuaries where they rest on muddy bottoms. their eyes sit on the right side of the body." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 8.0 +sell_value_min = 4 +sell_value_max = 9 +sell_value_curve = 0.9 diff --git a/fish/species/flyingfish_tropical/flyingfish_tropical.tres b/fish/species/flyingfish_tropical/flyingfish_tropical.tres new file mode 100644 index 0000000..7f94269 --- /dev/null +++ b/fish/species/flyingfish_tropical/flyingfish_tropical.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"flyingfish_tropical" +display_name = "tropical flyingfish" +active = false +catalog_number = 6603 +collection_group = &"Surface ocean fish" +logbook_fact = "tropical flyingfish accelerate underwater before spreading enlarged fins above the surface. glides help them escape pursuing predators." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.35 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 1.5 +sell_value_min = 10 +sell_value_max = 22 +sell_value_curve = 0.94 diff --git a/fish/species/foureyes_largescale/foureyes_largescale.tres b/fish/species/foureyes_largescale/foureyes_largescale.tres new file mode 100644 index 0000000..23b1b6c --- /dev/null +++ b/fish/species/foureyes_largescale/foureyes_largescale.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"foureyes_largescale" +display_name = "largescale foureyes" +active = false +catalog_number = 202 +collection_group = &"Brackish oddities" +logbook_fact = "largescale foureyes cruise with each eye divided across the waterline. one half watches above while the other scans below." +allowed_water_types = 3 +rarity = 2 +base_catch_weight = 0.32 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 1.0 +sell_value_min = 10 +sell_value_max = 23 +sell_value_curve = 0.95 diff --git a/fish/species/freshwater_drum/freshwater_drum.tres b/fish/species/freshwater_drum/freshwater_drum.tres new file mode 100644 index 0000000..bd1389b --- /dev/null +++ b/fish/species/freshwater_drum/freshwater_drum.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"freshwater_drum" +display_name = "freshwater drum" +active = false +catalog_number = 2902 +collection_group = &"Freshwater oddities" +logbook_fact = "freshwater drum crush snails and mussels with powerful throat teeth. muscles vibrating against the swim bladder produce a low drumming sound." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 35.0 +sell_value_min = 7 +sell_value_max = 20 +sell_value_curve = 0.85 diff --git a/fish/species/gar_alligator/gar_alligator.tres b/fish/species/gar_alligator/gar_alligator.tres new file mode 100644 index 0000000..48c02e2 --- /dev/null +++ b/fish/species/gar_alligator/gar_alligator.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"gar_alligator" +display_name = "alligator gar" +active = false +catalog_number = 2701 +collection_group = &"Freshwater giants" +logbook_fact = "alligator gar combine a broad tooth-filled snout with heavy armor-like scales. a vascular swim bladder lets them breathe air at the surface." +allowed_water_types = 1 +rarity = 4 +base_catch_weight = 0.055 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 20.0 +weight_max_lb = 300.0 +sell_value_min = 55 +sell_value_max = 125 +sell_value_curve = 0.8 diff --git a/fish/species/gar_longnose/gar_longnose.tres b/fish/species/gar_longnose/gar_longnose.tres new file mode 100644 index 0000000..29a8d68 --- /dev/null +++ b/fish/species/gar_longnose/gar_longnose.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"gar_longnose" +display_name = "longnose gar" +active = false +catalog_number = 103 +collection_group = &"Ancient freshwater fish" +logbook_fact = "longnose gar wait near the surface before snapping sideways at passing fish. their narrow jaws carry rows of fine needle-like teeth." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 35.0 +sell_value_min = 14 +sell_value_max = 34 +sell_value_curve = 0.85 diff --git a/fish/species/gar_spotted/gar_spotted.tres b/fish/species/gar_spotted/gar_spotted.tres new file mode 100644 index 0000000..abb3d16 --- /dev/null +++ b/fish/species/gar_spotted/gar_spotted.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"gar_spotted" +display_name = "spotted gar" +active = false +catalog_number = 106 +collection_group = &"Ancient freshwater fish" +logbook_fact = "spotted gar linger among vegetation where their mottled bodies break up their outline. they rise to gulp air as well as breathing through gills." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 15.0 +sell_value_min = 13 +sell_value_max = 29 +sell_value_curve = 0.88 diff --git a/fish/species/goby_round/goby_round.tres b/fish/species/goby_round/goby_round.tres index 4c8872e..20d76a4 100644 --- a/fish/species/goby_round/goby_round.tres +++ b/fish/species/goby_round/goby_round.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.35 script = ExtResource("1_fish_data") id = &"goby_round" display_name = "round goby" +active = true +catalog_number = 3401 +collection_group = &"Freshwater small fish" +logbook_fact = "round gobies use fused pelvic fins like a suction cup to hold onto rocks. they are small fish with a famously large appetite." allowed_water_types = 1 base_catch_weight = 8.0 catch_profile = ExtResource("2_profile") diff --git a/fish/species/goldeye/goldeye.tres b/fish/species/goldeye/goldeye.tres new file mode 100644 index 0000000..c623dc8 --- /dev/null +++ b/fish/species/goldeye/goldeye.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"goldeye" +display_name = "goldeye" +active = false +catalog_number = 2903 +collection_group = &"Freshwater oddities" +logbook_fact = "goldeye patrol turbid rivers with large light-sensitive eyes and a toothed tongue. they rise toward the surface to hunt insects and small fish." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 6.0 +sell_value_min = 12 +sell_value_max = 25 +sell_value_curve = 0.9 diff --git a/fish/species/goldfish/goldfish.tres b/fish/species/goldfish/goldfish.tres index 153365d..c70b2d3 100644 --- a/fish/species/goldfish/goldfish.tres +++ b/fish/species/goldfish/goldfish.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"goldfish" display_name = "goldfish" +active = true +catalog_number = 3002 +collection_group = &"Freshwater ornamental" +logbook_fact = "goldfish can tolerate a surprisingly wide range of conditions. their wild relatives often live in slow, weedy water." allowed_water_types = 1 base_catch_weight = 0.5 catch_profile = ExtResource("2_profile") diff --git a/fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres b/fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres index d6a288a..aa75c08 100644 --- a/fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres +++ b/fish/species/goldfish_bubbleeye/goldfish_bubbleeye.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"goldfish_bubbleeye" display_name = "bubble-eye goldfish" +active = true +catalog_number = 3001 +collection_group = &"Freshwater ornamental" +logbook_fact = "bubble-eye goldfish have delicate fluid-filled sacs beneath their eyes, making careful handling especially important." allowed_water_types = 1 rarity = 1 base_catch_weight = 0.35 diff --git a/fish/species/gourami_giant/gourami_giant.tres b/fish/species/gourami_giant/gourami_giant.tres new file mode 100644 index 0000000..b7a9095 --- /dev/null +++ b/fish/species/gourami_giant/gourami_giant.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"gourami_giant" +display_name = "giant gourami" +active = false +catalog_number = 7505 +collection_group = &"Tropical freshwater fish" +logbook_fact = "giant gouramis breathe surface air through a specialized labyrinth organ. adults graze plants but also investigate insects and small animals." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 20.0 +sell_value_min = 13 +sell_value_max = 31 +sell_value_curve = 0.86 diff --git a/fish/species/grayling_arctic/grayling_arctic.tres b/fish/species/grayling_arctic/grayling_arctic.tres new file mode 100644 index 0000000..fc1e09d --- /dev/null +++ b/fish/species/grayling_arctic/grayling_arctic.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"grayling_arctic" +display_name = "arctic grayling" +active = false +catalog_number = 1102 +collection_group = &"Cold freshwater salmonids" +logbook_fact = "arctic grayling carry a tall, colorful dorsal fin like a sail. they feed on drifting insects in cold, clear rivers and lakes." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.75 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 6.0 +sell_value_min = 6 +sell_value_max = 14 +sell_value_curve = 0.9 diff --git a/fish/species/green_sunfish/green_sunfish.tres b/fish/species/green_sunfish/green_sunfish.tres new file mode 100644 index 0000000..92a6838 --- /dev/null +++ b/fish/species/green_sunfish/green_sunfish.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"green_sunfish" +display_name = "green sunfish" +active = false +catalog_number = 3103 +collection_group = &"Freshwater panfish" +logbook_fact = "green sunfish tolerate small, warm, cloudy pools better than many relatives. a large mouth lets them tackle insects, crayfish, and fish." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 3.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 1.5 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 1.0 diff --git a/fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres b/fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres new file mode 100644 index 0000000..fae0ea5 --- /dev/null +++ b/fish/species/grouper_atlantic_goliath/grouper_atlantic_goliath.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"grouper_atlantic_goliath" +display_name = "Atlantic goliath grouper" +active = false +catalog_number = 5801 +collection_group = &"Reef predators" +logbook_fact = "atlantic goliath groupers occupy reefs, wrecks, and mangrove roots. enormous mouths pull prey inward with a sudden pressure drop." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.05 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 20.0 +weight_max_lb = 800.0 +sell_value_min = 50 +sell_value_max = 125 +sell_value_curve = 0.78 diff --git a/fish/species/grouper_giant/grouper_giant.tres b/fish/species/grouper_giant/grouper_giant.tres new file mode 100644 index 0000000..bc4ecf1 --- /dev/null +++ b/fish/species/grouper_giant/grouper_giant.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"grouper_giant" +display_name = "giant grouper" +active = false +catalog_number = 5803 +collection_group = &"Reef predators" +logbook_fact = "giant groupers become massive ambush predators around indo-pacific reefs. juveniles carry bold black-and-yellow markings." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.045 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 20.0 +weight_max_lb = 880.0 +sell_value_min = 52 +sell_value_max = 128 +sell_value_curve = 0.78 diff --git a/fish/species/grouper_gulf/grouper_gulf.tres b/fish/species/grouper_gulf/grouper_gulf.tres index 1e0446e..c3aaffa 100644 --- a/fish/species/grouper_gulf/grouper_gulf.tres +++ b/fish/species/grouper_gulf/grouper_gulf.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"grouper_gulf" display_name = "gulf grouper" +active = true +catalog_number = 5805 +collection_group = &"Reef predators" +logbook_fact = "gulf grouper are ambush predators that use a sudden gulp to pull prey into their cavernous mouths." allowed_water_types = 2 rarity = 1 base_catch_weight = 0.3 diff --git a/fish/species/grouper_nassau/grouper_nassau.tres b/fish/species/grouper_nassau/grouper_nassau.tres new file mode 100644 index 0000000..06bbcdf --- /dev/null +++ b/fish/species/grouper_nassau/grouper_nassau.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"grouper_nassau" +display_name = "Nassau grouper" +active = false +catalog_number = 5806 +collection_group = &"Reef predators" +logbook_fact = "nassau groupers shift their bars and colors with mood and surroundings. adults gather at traditional reef sites to spawn." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.12 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 55.0 +sell_value_min = 25 +sell_value_max = 62 +sell_value_curve = 0.82 diff --git a/fish/species/grouper_red/grouper_red.tres b/fish/species/grouper_red/grouper_red.tres index 5594641..b83fecb 100644 --- a/fish/species/grouper_red/grouper_red.tres +++ b/fish/species/grouper_red/grouper_red.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"grouper_red" display_name = "red grouper" +active = true +catalog_number = 5807 +collection_group = &"Reef predators" +logbook_fact = "red grouper excavate shelters in reef rubble. the hollows they make can become hiding places for many smaller animals." allowed_water_types = 2 rarity = 2 base_catch_weight = 0.2 diff --git a/fish/species/grunt_bluestriped/grunt_bluestriped.tres b/fish/species/grunt_bluestriped/grunt_bluestriped.tres new file mode 100644 index 0000000..ef78e38 --- /dev/null +++ b/fish/species/grunt_bluestriped/grunt_bluestriped.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"grunt_bluestriped" +display_name = "bluestriped grunt" +active = false +catalog_number = 5902 +collection_group = &"Reef schooling fish" +logbook_fact = "bluestriped grunts shelter on reefs by day and spread over seagrass to feed at night. grinding throat teeth produce audible grunts." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 3.0 +sell_value_min = 3 +sell_value_max = 7 +sell_value_curve = 0.94 diff --git a/fish/species/grunt_french/grunt_french.tres b/fish/species/grunt_french/grunt_french.tres new file mode 100644 index 0000000..d695ecd --- /dev/null +++ b/fish/species/grunt_french/grunt_french.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"grunt_french" +display_name = "French grunt" +active = false +catalog_number = 5903 +collection_group = &"Reef schooling fish" +logbook_fact = "french grunts gather in yellow-striped schools around reefs and wrecks. they travel into nearby sand and grass beds after dark." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 3.5 +sell_value_min = 3 +sell_value_max = 7 +sell_value_curve = 0.94 diff --git a/fish/species/gulper_eel/gulper_eel.tres b/fish/species/gulper_eel/gulper_eel.tres new file mode 100644 index 0000000..328a595 --- /dev/null +++ b/fish/species/gulper_eel/gulper_eel.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"gulper_eel" +display_name = "gulper eel" +active = false +catalog_number = 1803 +collection_group = &"Deep-sea oddities" +logbook_fact = "gulper eels unfold enormous mouths to engulf prey in the deep sea. a whip-like tail ends in a small light-producing organ." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.04 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 18.0 +sell_value_min = 44 +sell_value_max = 92 +sell_value_curve = 0.86 diff --git a/fish/species/guppy/guppy.tres b/fish/species/guppy/guppy.tres new file mode 100644 index 0000000..911447f --- /dev/null +++ b/fish/species/guppy/guppy.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"guppy" +display_name = "guppy" +active = false +catalog_number = 2101 +collection_group = &"Freshwater aquarium fish" +logbook_fact = "guppies are livebearers whose young arrive ready to swim. males display bright colors while females often favor larger, less flashy bodies." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 1.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.01 +weight_max_lb = 0.15 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 0.98 diff --git a/fish/species/haddock/haddock.tres b/fish/species/haddock/haddock.tres new file mode 100644 index 0000000..0f73e63 --- /dev/null +++ b/fish/species/haddock/haddock.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"haddock" +display_name = "haddock" +active = false +catalog_number = 1405 +collection_group = &"Cold shelf fish" +logbook_fact = "haddock are recognized by a dark shoulder mark and black lateral line. schools forage over cold seafloors for small bottom animals." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 20.0 +sell_value_min = 4 +sell_value_max = 11 +sell_value_curve = 0.9 diff --git a/fish/species/hake_pacific/hake_pacific.tres b/fish/species/hake_pacific/hake_pacific.tres new file mode 100644 index 0000000..85b521b --- /dev/null +++ b/fish/species/hake_pacific/hake_pacific.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"hake_pacific" +display_name = "pacific hake" +active = false +catalog_number = 1407 +collection_group = &"Cold shelf fish" +logbook_fact = "pacific hake rise from deep water at night to feed on krill and fish. large schools migrate along the west coast with changing seasons." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 8.0 +sell_value_min = 3 +sell_value_max = 9 +sell_value_curve = 0.92 diff --git a/fish/species/hake_silver/hake_silver.tres b/fish/species/hake_silver/hake_silver.tres new file mode 100644 index 0000000..79d7ea0 --- /dev/null +++ b/fish/species/hake_silver/hake_silver.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"hake_silver" +display_name = "silver hake" +active = false +catalog_number = 1408 +collection_group = &"Cold shelf fish" +logbook_fact = "silver hake hunt fish and crustaceans over sandy atlantic shelves. they move upward after dark and return toward the bottom by day." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 5.0 +sell_value_min = 3 +sell_value_max = 8 +sell_value_curve = 0.92 diff --git a/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres b/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres new file mode 100644 index 0000000..7362805 --- /dev/null +++ b/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"halfbeak_ballyhoo" +display_name = "ballyhoo" +active = false +catalog_number = 6601 +collection_group = &"Surface ocean fish" +logbook_fact = "ballyhoo skim warm ocean surfaces with an extended lower jaw. tight schools scatter into quick leaps when predators strike." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 1.0 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 0.98 diff --git a/fish/species/halibut_atlantic/halibut_atlantic.tres b/fish/species/halibut_atlantic/halibut_atlantic.tres new file mode 100644 index 0000000..c8bf167 --- /dev/null +++ b/fish/species/halibut_atlantic/halibut_atlantic.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"halibut_atlantic" +display_name = "atlantic halibut" +active = false +catalog_number = 3701 +collection_group = &"Large flatfish" +logbook_fact = "atlantic halibut are immense right-eyed flatfish of cold northern seas. adults ambush fish and squid from deep rocky or sandy bottoms." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 10.0 +weight_max_lb = 300.0 +sell_value_min = 32 +sell_value_max = 82 +sell_value_curve = 0.8 diff --git a/fish/species/halibut_pacific/halibut_pacific.tres b/fish/species/halibut_pacific/halibut_pacific.tres new file mode 100644 index 0000000..9980aef --- /dev/null +++ b/fish/species/halibut_pacific/halibut_pacific.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"halibut_pacific" +display_name = "pacific halibut" +active = false +catalog_number = 3702 +collection_group = &"Large flatfish" +logbook_fact = "pacific halibut lie camouflaged on cold continental shelves. powerful flat bodies can travel long distances between feeding and spawning grounds." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 10.0 +weight_max_lb = 350.0 +sell_value_min = 34 +sell_value_max = 86 +sell_value_curve = 0.8 diff --git a/fish/species/hellbender/hellbender.tres b/fish/species/hellbender/hellbender.tres new file mode 100644 index 0000000..8a9d228 --- /dev/null +++ b/fish/species/hellbender/hellbender.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"hellbender" +display_name = "hellbender" +active = false +catalog_number = 2002 +collection_group = &"Freshwater amphibians" +logbook_fact = "hellbenders hide beneath large rocks in cool, clean rivers. folds of loose skin absorb oxygen while the flattened body grips the current." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 5.5 +sell_value_min = 24 +sell_value_max = 54 +sell_value_curve = 0.91 diff --git a/fish/species/herring_atlantic/herring_atlantic.tres b/fish/species/herring_atlantic/herring_atlantic.tres new file mode 100644 index 0000000..00f1e36 --- /dev/null +++ b/fish/species/herring_atlantic/herring_atlantic.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"herring_atlantic" +display_name = "atlantic herring" +active = false +catalog_number = 1301 +collection_group = &"Cold schooling fish" +logbook_fact = "atlantic herring gather in immense schools that move between feeding and spawning grounds. they filter plankton with fine gill rakers." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 3.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 1.5 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 0.98 diff --git a/fish/species/herring_pacific/herring_pacific.tres b/fish/species/herring_pacific/herring_pacific.tres new file mode 100644 index 0000000..27dcff7 --- /dev/null +++ b/fish/species/herring_pacific/herring_pacific.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"herring_pacific" +display_name = "pacific herring" +active = false +catalog_number = 1304 +collection_group = &"Cold schooling fish" +logbook_fact = "pacific herring return to coastal shallows to coat plants and rocks with eggs. their oily schools support entire marine food webs." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 1.5 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 0.98 diff --git a/fish/species/hogfish/hogfish.tres b/fish/species/hogfish/hogfish.tres new file mode 100644 index 0000000..8d7dd29 --- /dev/null +++ b/fish/species/hogfish/hogfish.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"hogfish" +display_name = "hogfish" +active = false +catalog_number = 6103 +collection_group = &"Reef wrasses" +logbook_fact = "hogfish root through sand with long pig-like snouts in search of shellfish. adults can change from female to male as social groups shift." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 20.0 +sell_value_min = 12 +sell_value_max = 30 +sell_value_curve = 0.86 diff --git a/fish/species/ide/ide.tres b/fish/species/ide/ide.tres new file mode 100644 index 0000000..dcc9980 --- /dev/null +++ b/fish/species/ide/ide.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"ide" +display_name = "ide" +active = false +catalog_number = 2507 +collection_group = &"Freshwater coarse fish" +logbook_fact = "ide move between rivers, lakes, and brackish coastal water in loose schools. adults eat insects, crustaceans, plants, and small fish." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 9.0 +sell_value_min = 6 +sell_value_max = 14 +sell_value_curve = 0.9 diff --git a/fish/species/jack_crevalle/jack_crevalle.tres b/fish/species/jack_crevalle/jack_crevalle.tres new file mode 100644 index 0000000..e20485e --- /dev/null +++ b/fish/species/jack_crevalle/jack_crevalle.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"jack_crevalle" +display_name = "crevalle jack" +active = false +catalog_number = 705 +collection_group = &"Coastal pelagic fish" +logbook_fact = "crevalle jacks patrol warm coasts in fast-moving schools. their deep bodies and forked tails deliver long, powerful runs." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 35.0 +sell_value_min = 7 +sell_value_max = 20 +sell_value_curve = 0.84 diff --git a/fish/species/jelly_crystal/jelly_crystal.tres b/fish/species/jelly_crystal/jelly_crystal.tres new file mode 100644 index 0000000..fe2f34e --- /dev/null +++ b/fish/species/jelly_crystal/jelly_crystal.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"jelly_crystal" +display_name = "crystal jelly" +active = false +catalog_number = 3501 +collection_group = &"Jellies" +logbook_fact = "crystal jellies are nearly transparent except for glowing points around the bell. their green fluorescent protein transformed biological research." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 4.0 +sell_value_min = 15 +sell_value_max = 34 +sell_value_curve = 0.93 diff --git a/fish/species/jelly_lions_mane/jelly_lions_mane.tres b/fish/species/jelly_lions_mane/jelly_lions_mane.tres new file mode 100644 index 0000000..cedb3c8 --- /dev/null +++ b/fish/species/jelly_lions_mane/jelly_lions_mane.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"jelly_lions_mane" +display_name = "lion's mane jelly" +active = false +catalog_number = 3502 +collection_group = &"Jellies" +logbook_fact = "lion's mane jellies trail dense curtains of tentacles through cold seas. the bell darkens from yellow to deep red as the animal grows." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.11 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 200.0 +sell_value_min = 24 +sell_value_max = 58 +sell_value_curve = 0.82 diff --git a/fish/species/jelly_moon/jelly_moon.tres b/fish/species/jelly_moon/jelly_moon.tres new file mode 100644 index 0000000..ef7cbe1 --- /dev/null +++ b/fish/species/jelly_moon/jelly_moon.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"jelly_moon" +display_name = "moon jelly" +active = false +catalog_number = 3503 +collection_group = &"Jellies" +logbook_fact = "moon jellies pulse gently with four horseshoe-shaped organs visible through the bell. short tentacles sweep plankton toward the mouth." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 5.0 +sell_value_min = 6 +sell_value_max = 14 +sell_value_curve = 0.94 diff --git a/fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres b/fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres new file mode 100644 index 0000000..e3697b3 --- /dev/null +++ b/fish/species/jelly_pacific_sea_nettle/jelly_pacific_sea_nettle.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"jelly_pacific_sea_nettle" +display_name = "Pacific sea nettle" +active = false +catalog_number = 3504 +collection_group = &"Jellies" +logbook_fact = "pacific sea nettles carry rust-colored stripes across pale bells. long tentacles and frilled mouth arms capture plankton and small fish." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 12.0 +sell_value_min = 14 +sell_value_max = 32 +sell_value_curve = 0.9 diff --git a/fish/species/jelly_sea_wasp/jelly_sea_wasp.tres b/fish/species/jelly_sea_wasp/jelly_sea_wasp.tres new file mode 100644 index 0000000..64c2288 --- /dev/null +++ b/fish/species/jelly_sea_wasp/jelly_sea_wasp.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"jelly_sea_wasp" +display_name = "sea wasp" +active = false +catalog_number = 3505 +collection_group = &"Jellies" +logbook_fact = "sea wasps have box-shaped bells and clusters of eyes along the lower edge. their long tentacles deliver exceptionally potent venom." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.035 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 6.0 +sell_value_min = 42 +sell_value_max = 90 +sell_value_curve = 0.9 diff --git a/fish/species/knifefish_clown/knifefish_clown.tres b/fish/species/knifefish_clown/knifefish_clown.tres new file mode 100644 index 0000000..23781ad --- /dev/null +++ b/fish/species/knifefish_clown/knifefish_clown.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"knifefish_clown" +display_name = "clown knifefish" +active = false +catalog_number = 7501 +collection_group = &"Tropical freshwater fish" +logbook_fact = "clown knifefish undulate one long belly fin to glide forward or backward. dark eye-like spots line their silver nocturnal bodies." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 25.0 +sell_value_min = 16 +sell_value_max = 38 +sell_value_curve = 0.86 diff --git a/fish/species/koi/koi.tres b/fish/species/koi/koi.tres new file mode 100644 index 0000000..7c110cc --- /dev/null +++ b/fish/species/koi/koi.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"koi" +display_name = "koi" +active = false +catalog_number = 3003 +collection_group = &"Freshwater ornamental" +logbook_fact = "koi are colorful domesticated forms of common carp selected over many generations. each fish carries a distinctive arrangement of patches and scales." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 35.0 +sell_value_min = 14 +sell_value_max = 34 +sell_value_curve = 0.87 diff --git a/fish/species/krill_antarctic/krill_antarctic.tres b/fish/species/krill_antarctic/krill_antarctic.tres new file mode 100644 index 0000000..390487d --- /dev/null +++ b/fish/species/krill_antarctic/krill_antarctic.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"krill_antarctic" +display_name = "Antarctic krill" +active = false +catalog_number = 3802 +collection_group = &"Lobsters and shrimp" +logbook_fact = "antarctic krill form enormous swarms beneath southern seas and ice. these small crustaceans feed whales, seals, penguins, and fish." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.001 +weight_max_lb = 0.01 +sell_value_min = 10 +sell_value_max = 22 +sell_value_curve = 0.99 diff --git a/fish/species/ladyfish/ladyfish.tres b/fish/species/ladyfish/ladyfish.tres new file mode 100644 index 0000000..1cc8e7b --- /dev/null +++ b/fish/species/ladyfish/ladyfish.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"ladyfish" +display_name = "ladyfish" +active = false +catalog_number = 7403 +collection_group = &"Tropical flats fish" +logbook_fact = "ladyfish race through warm shallows after schooling prey and often leap when pursued. a deeply forked tail powers their slender bodies." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 8.0 +sell_value_min = 4 +sell_value_max = 10 +sell_value_curve = 0.9 diff --git a/fish/species/lanternfish_spotted/lanternfish_spotted.tres b/fish/species/lanternfish_spotted/lanternfish_spotted.tres new file mode 100644 index 0000000..8d47916 --- /dev/null +++ b/fish/species/lanternfish_spotted/lanternfish_spotted.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"lanternfish_spotted" +display_name = "spotted lanternfish" +active = false +catalog_number = 1806 +collection_group = &"Deep-sea oddities" +logbook_fact = "spotted lanternfish carry rows of light-producing organs along their bodies. immense schools rise toward the surface each night." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.5 +sell_value_min = 14 +sell_value_max = 30 +sell_value_curve = 0.95 diff --git a/fish/species/largemouth_bass/largemouth_bass.tres b/fish/species/largemouth_bass/largemouth_bass.tres new file mode 100644 index 0000000..e32cd20 --- /dev/null +++ b/fish/species/largemouth_bass/largemouth_bass.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"largemouth_bass" +display_name = "largemouth bass" +active = false +catalog_number = 2201 +collection_group = &"Freshwater bass" +logbook_fact = "largemouth bass wait among weeds and timber before lunging at prey. the upper jaw extends beyond the eye when the mouth is closed." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 18.0 +sell_value_min = 4 +sell_value_max = 12 +sell_value_curve = 0.9 diff --git a/fish/species/lingcod/lingcod.tres b/fish/species/lingcod/lingcod.tres new file mode 100644 index 0000000..34c8c0b --- /dev/null +++ b/fish/species/lingcod/lingcod.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"lingcod" +display_name = "lingcod" +active = false +catalog_number = 7001 +collection_group = &"Temperate reef predators" +logbook_fact = "lingcod guard rocky dens and ambush fish with a huge tooth-lined mouth. despite the name, they are greenling relatives rather than cod." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 60.0 +sell_value_min = 14 +sell_value_max = 38 +sell_value_curve = 0.83 diff --git a/fish/species/lionfish_red/lionfish_red.tres b/fish/species/lionfish_red/lionfish_red.tres new file mode 100644 index 0000000..9b46e72 --- /dev/null +++ b/fish/species/lionfish_red/lionfish_red.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"lionfish_red" +display_name = "red lionfish" +active = false +catalog_number = 5201 +collection_group = &"Reef ambush fish" +logbook_fact = "red lionfish spread ornate venomous spines when threatened. broad fins herd smaller fish into corners before a rapid gulp." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 3.0 +sell_value_min = 11 +sell_value_max = 25 +sell_value_curve = 0.92 diff --git a/fish/species/loach_clown/loach_clown.tres b/fish/species/loach_clown/loach_clown.tres new file mode 100644 index 0000000..afe5549 --- /dev/null +++ b/fish/species/loach_clown/loach_clown.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"loach_clown" +display_name = "clown loach" +active = false +catalog_number = 7502 +collection_group = &"Tropical freshwater fish" +logbook_fact = "clown loaches rest in groups and make clicking sounds while feeding. orange bodies carry three broad black bands and small eye spines." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.32 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 2.0 +sell_value_min = 10 +sell_value_max = 22 +sell_value_curve = 0.9 diff --git a/fish/species/loach_weather/loach_weather.tres b/fish/species/loach_weather/loach_weather.tres new file mode 100644 index 0000000..8b23ea1 --- /dev/null +++ b/fish/species/loach_weather/loach_weather.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"loach_weather" +display_name = "weather loach" +active = false +catalog_number = 2905 +collection_group = &"Freshwater oddities" +logbook_fact = "weather loaches gulp air and pass it through the intestine when oxygen runs low. restless activity often increases as air pressure falls." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.85 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.7 +sell_value_min = 5 +sell_value_max = 11 +sell_value_curve = 0.95 diff --git a/fish/species/lobster_american/lobster_american.tres b/fish/species/lobster_american/lobster_american.tres new file mode 100644 index 0000000..92bdb7f --- /dev/null +++ b/fish/species/lobster_american/lobster_american.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"lobster_american" +display_name = "American lobster" +active = false +catalog_number = 3801 +collection_group = &"Lobsters and shrimp" +logbook_fact = "american lobsters shelter in rocky crevices and emerge to forage along the bottom. one claw crushes while the other cuts and grips." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 44.0 +sell_value_min = 16 +sell_value_max = 42 +sell_value_curve = 0.86 diff --git a/fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres b/fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres new file mode 100644 index 0000000..94672a9 --- /dev/null +++ b/fish/species/lobster_caribbean_spiny/lobster_caribbean_spiny.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"lobster_caribbean_spiny" +display_name = "Caribbean spiny lobster" +active = false +catalog_number = 3803 +collection_group = &"Lobsters and shrimp" +logbook_fact = "caribbean spiny lobsters rely on long antennae and a thorny shell instead of large claws. groups march together across the seafloor." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 26.0 +sell_value_min = 15 +sell_value_max = 38 +sell_value_curve = 0.87 diff --git a/fish/species/lungfish_west_african/lungfish_west_african.tres b/fish/species/lungfish_west_african/lungfish_west_african.tres new file mode 100644 index 0000000..4baad67 --- /dev/null +++ b/fish/species/lungfish_west_african/lungfish_west_african.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"lungfish_west_african" +display_name = "West African lungfish" +active = false +catalog_number = 107 +collection_group = &"Ancient freshwater fish" +logbook_fact = "west african lungfish breathe air with paired lungs. when floodplains dry, they seal themselves in a mud cocoon until water returns." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 10.0 +sell_value_min = 12 +sell_value_max = 28 +sell_value_curve = 0.86 diff --git a/fish/species/mackerel_atlantic/mackerel_atlantic.tres b/fish/species/mackerel_atlantic/mackerel_atlantic.tres index 514ef07..edf6d38 100644 --- a/fish/species/mackerel_atlantic/mackerel_atlantic.tres +++ b/fish/species/mackerel_atlantic/mackerel_atlantic.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"mackerel_atlantic" display_name = "atlantic mackerel" +active = true +catalog_number = 701 +collection_group = &"Coastal pelagic fish" +logbook_fact = "atlantic mackerel travel in fast schools across the north atlantic and feed on plankton and small schooling fish." allowed_water_types = 2 base_catch_weight = 0.5 catch_profile = ExtResource("2_profile") diff --git a/fish/species/mackerel_cero/mackerel_cero.tres b/fish/species/mackerel_cero/mackerel_cero.tres index fbbb612..6dc9040 100644 --- a/fish/species/mackerel_cero/mackerel_cero.tres +++ b/fish/species/mackerel_cero/mackerel_cero.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"mackerel_cero" display_name = "cero mackerel" +active = true +catalog_number = 703 +collection_group = &"Coastal pelagic fish" +logbook_fact = "cero mackerel are streamlined coastal hunters. sharp teeth help them slash through schools of smaller fish." allowed_water_types = 2 rarity = 1 base_catch_weight = 0.35 diff --git a/fish/species/mackerel_chub/mackerel_chub.tres b/fish/species/mackerel_chub/mackerel_chub.tres index f4ceca1..189904e 100644 --- a/fish/species/mackerel_chub/mackerel_chub.tres +++ b/fish/species/mackerel_chub/mackerel_chub.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"mackerel_chub" display_name = "chub mackerel" +active = true +catalog_number = 704 +collection_group = &"Coastal pelagic fish" +logbook_fact = "chub mackerel school near the surface and follow plankton blooms. their dark wavy bars help identify them at a glance." allowed_water_types = 2 base_catch_weight = 0.5 catch_profile = ExtResource("2_profile") diff --git a/fish/species/mackerel_king/mackerel_king.tres b/fish/species/mackerel_king/mackerel_king.tres index 2c28071..4e0a047 100644 --- a/fish/species/mackerel_king/mackerel_king.tres +++ b/fish/species/mackerel_king/mackerel_king.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"mackerel_king" display_name = "king mackerel" +active = true +catalog_number = 706 +collection_group = &"Coastal pelagic fish" +logbook_fact = "king mackerel are swift coastal predators. their pointed teeth and long body are built for sudden bursts of speed." allowed_water_types = 2 rarity = 1 base_catch_weight = 0.3 diff --git a/fish/species/mackerel_spanish/mackerel_spanish.tres b/fish/species/mackerel_spanish/mackerel_spanish.tres index 0319917..0aee136 100644 --- a/fish/species/mackerel_spanish/mackerel_spanish.tres +++ b/fish/species/mackerel_spanish/mackerel_spanish.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"mackerel_spanish" display_name = "spanish mackerel" +active = true +catalog_number = 707 +collection_group = &"Coastal pelagic fish" +logbook_fact = "spanish mackerel hunt in warm coastal waters and often travel in loose schools while chasing baitfish." allowed_water_types = 2 rarity = 1 base_catch_weight = 0.35 diff --git a/fish/species/madtom_tadpole/madtom_tadpole.tres b/fish/species/madtom_tadpole/madtom_tadpole.tres new file mode 100644 index 0000000..d43c1c5 --- /dev/null +++ b/fish/species/madtom_tadpole/madtom_tadpole.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"madtom_tadpole" +display_name = "tadpole madtom" +active = false +catalog_number = 2406 +collection_group = &"Freshwater catfish" +logbook_fact = "tadpole madtoms are tiny nocturnal catfish that shelter beneath vegetation and debris. venomous fin spines discourage larger predators." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.35 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.02 +weight_max_lb = 0.15 +sell_value_min = 8 +sell_value_max = 16 +sell_value_curve = 0.95 diff --git a/fish/species/mahi_mahi/mahi_mahi.tres b/fish/species/mahi_mahi/mahi_mahi.tres new file mode 100644 index 0000000..ded9958 --- /dev/null +++ b/fish/species/mahi_mahi/mahi_mahi.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"mahi_mahi" +display_name = "mahi-mahi" +active = false +catalog_number = 4701 +collection_group = &"Oceanic pelagic fish" +logbook_fact = "mahi-mahi flash brilliant blue, green, and gold while chasing prey near the surface. they grow quickly and gather around floating objects." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 50.0 +sell_value_min = 15 +sell_value_max = 38 +sell_value_curve = 0.84 diff --git a/fish/species/mahseer_golden/mahseer_golden.tres b/fish/species/mahseer_golden/mahseer_golden.tres new file mode 100644 index 0000000..4a51858 --- /dev/null +++ b/fish/species/mahseer_golden/mahseer_golden.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"mahseer_golden" +display_name = "golden mahseer" +active = false +catalog_number = 7603 +collection_group = &"Tropical freshwater predators" +logbook_fact = "golden mahseer migrate through swift mountain rivers to reach spawning grounds. large scales shine bronze beneath reddish fins." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.09 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 8.0 +weight_max_lb = 90.0 +sell_value_min = 32 +sell_value_max = 72 +sell_value_curve = 0.82 diff --git a/fish/species/manatee_west_indian/manatee_west_indian.tres b/fish/species/manatee_west_indian/manatee_west_indian.tres new file mode 100644 index 0000000..65094d0 --- /dev/null +++ b/fish/species/manatee_west_indian/manatee_west_indian.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"manatee_west_indian" +display_name = "West Indian manatee" +active = false +catalog_number = 505 +collection_group = &"Coastal marine mammals" +logbook_fact = "west indian manatees graze aquatic plants in warm coastal water and rivers. they surface regularly to breathe through nostrils atop the snout." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.012 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 440.0 +weight_max_lb = 1300.0 +sell_value_min = 70 +sell_value_max = 160 +sell_value_curve = 0.77 diff --git a/fish/species/manta_ray_giant/manta_ray_giant.tres b/fish/species/manta_ray_giant/manta_ray_giant.tres new file mode 100644 index 0000000..29eeede --- /dev/null +++ b/fish/species/manta_ray_giant/manta_ray_giant.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"manta_ray_giant" +display_name = "giant manta ray" +active = false +catalog_number = 5102 +collection_group = &"Rays and skates" +logbook_fact = "giant manta rays funnel plankton into wide mouths with two flexible head fins. each belly carries a unique pattern of dark spots." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.025 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 100.0 +weight_max_lb = 1000.0 +sell_value_min = 65 +sell_value_max = 150 +sell_value_curve = 0.76 diff --git a/fish/species/marlin_black/marlin_black.tres b/fish/species/marlin_black/marlin_black.tres index 39110c5..93f0ba2 100644 --- a/fish/species/marlin_black/marlin_black.tres +++ b/fish/species/marlin_black/marlin_black.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"marlin_black" display_name = "black marlin" +active = true +catalog_number = 4601 +collection_group = &"Oceanic billfish" +logbook_fact = "black marlin are powerful billfish that spend much of their lives in warm open ocean and can make blistering runs." allowed_water_types = 2 rarity = 3 base_catch_weight = 0.08 diff --git a/fish/species/marlin_blue/marlin_blue.tres b/fish/species/marlin_blue/marlin_blue.tres index b3328ba..51cff14 100644 --- a/fish/species/marlin_blue/marlin_blue.tres +++ b/fish/species/marlin_blue/marlin_blue.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"marlin_blue" display_name = "blue marlin" +active = true +catalog_number = 4602 +collection_group = &"Oceanic billfish" +logbook_fact = "blue marlin are highly migratory open-ocean hunters. their long bill helps them stun prey before turning back to feed." allowed_water_types = 2 rarity = 4 base_catch_weight = 0.05 diff --git a/fish/species/marlin_white/marlin_white.tres b/fish/species/marlin_white/marlin_white.tres index e90651c..bbbf34f 100644 --- a/fish/species/marlin_white/marlin_white.tres +++ b/fish/species/marlin_white/marlin_white.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"marlin_white" display_name = "white marlin" +active = true +catalog_number = 4605 +collection_group = &"Oceanic billfish" +logbook_fact = "white marlin favor warm offshore water and use their rounded dorsal fin and bill to weave through schools of prey." allowed_water_types = 2 rarity = 3 base_catch_weight = 0.1 diff --git a/fish/species/menhaden_atlantic/menhaden_atlantic.tres b/fish/species/menhaden_atlantic/menhaden_atlantic.tres new file mode 100644 index 0000000..ced8488 --- /dev/null +++ b/fish/species/menhaden_atlantic/menhaden_atlantic.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"menhaden_atlantic" +display_name = "atlantic menhaden" +active = false +catalog_number = 802 +collection_group = &"Coastal schooling fish" +logbook_fact = "atlantic menhaden strain plankton from coastal water with fine gill rakers. dense schools feed whales, seabirds, and predatory fish." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 3.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 1.5 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 0.98 diff --git a/fish/species/milkfish/milkfish.tres b/fish/species/milkfish/milkfish.tres new file mode 100644 index 0000000..08d5627 --- /dev/null +++ b/fish/species/milkfish/milkfish.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"milkfish" +display_name = "milkfish" +active = false +catalog_number = 7101 +collection_group = &"Tropical coastal fish" +logbook_fact = "milkfish graze algae and tiny organisms in warm coastal shallows. deeply forked tails drive large schools through lagoons and estuaries." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 25.0 +sell_value_min = 4 +sell_value_max = 12 +sell_value_curve = 0.88 diff --git a/fish/species/minnow_fathead/minnow_fathead.tres b/fish/species/minnow_fathead/minnow_fathead.tres new file mode 100644 index 0000000..be28197 --- /dev/null +++ b/fish/species/minnow_fathead/minnow_fathead.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"minnow_fathead" +display_name = "fathead minnow" +active = false +catalog_number = 2804 +collection_group = &"Freshwater minnows" +logbook_fact = "fathead minnows tolerate warm, muddy ponds where many fish struggle. males guard eggs laid beneath rocks, logs, and other cover." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 4.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.02 +weight_max_lb = 0.2 +sell_value_min = 1 +sell_value_max = 2 +sell_value_curve = 1.0 diff --git a/fish/species/monkfish/monkfish.tres b/fish/species/monkfish/monkfish.tres new file mode 100644 index 0000000..a4374e1 --- /dev/null +++ b/fish/species/monkfish/monkfish.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"monkfish" +display_name = "monkfish" +active = false +catalog_number = 603 +collection_group = &"Coastal oddities" +logbook_fact = "monkfish hide against the bottom and wave a fleshy lure above a cavernous mouth. a sudden gulp draws fish and crustaceans inward." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 55.0 +sell_value_min = 14 +sell_value_max = 35 +sell_value_curve = 0.84 diff --git a/fish/species/mooneye/mooneye.tres b/fish/species/mooneye/mooneye.tres new file mode 100644 index 0000000..e663618 --- /dev/null +++ b/fish/species/mooneye/mooneye.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"mooneye" +display_name = "mooneye" +active = false +catalog_number = 2904 +collection_group = &"Freshwater oddities" +logbook_fact = "mooneyes flash silver in clear rivers and lakes while feeding near the surface. their large eyes suit evening hunts for insects and small fish." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.85 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 4.0 +sell_value_min = 5 +sell_value_max = 11 +sell_value_curve = 0.92 diff --git a/fish/species/moray_green/moray_green.tres b/fish/species/moray_green/moray_green.tres new file mode 100644 index 0000000..36aee31 --- /dev/null +++ b/fish/species/moray_green/moray_green.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"moray_green" +display_name = "green moray" +active = false +catalog_number = 5301 +collection_group = &"Reef eels" +logbook_fact = "green morays appear green because yellow mucus coats blue-gray skin. a second set of jaws pulls captured prey deeper into the throat." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 30.0 +sell_value_min = 13 +sell_value_max = 32 +sell_value_curve = 0.86 diff --git a/fish/species/mudskipper_atlantic/mudskipper_atlantic.tres b/fish/species/mudskipper_atlantic/mudskipper_atlantic.tres new file mode 100644 index 0000000..f548d93 --- /dev/null +++ b/fish/species/mudskipper_atlantic/mudskipper_atlantic.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"mudskipper_atlantic" +display_name = "atlantic mudskipper" +active = false +catalog_number = 201 +collection_group = &"Brackish oddities" +logbook_fact = "atlantic mudskippers use sturdy fins to hop and crawl across exposed mud. moist skin and mouth linings let them breathe out of water." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 1.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.03 +weight_max_lb = 0.5 +sell_value_min = 5 +sell_value_max = 11 +sell_value_curve = 0.95 diff --git a/fish/species/mullet_red/mullet_red.tres b/fish/species/mullet_red/mullet_red.tres new file mode 100644 index 0000000..3b2a878 --- /dev/null +++ b/fish/species/mullet_red/mullet_red.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"mullet_red" +display_name = "red mullet" +active = false +catalog_number = 301 +collection_group = &"Coastal bottom fish" +logbook_fact = "red mullet comb sandy bottoms with two chin barbels that taste hidden prey. their foraging leaves winding trails in the sediment." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.9 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 3.0 +sell_value_min = 5 +sell_value_max = 11 +sell_value_curve = 0.92 diff --git a/fish/species/mullet_striped/mullet_striped.tres b/fish/species/mullet_striped/mullet_striped.tres new file mode 100644 index 0000000..7d75d6b --- /dev/null +++ b/fish/species/mullet_striped/mullet_striped.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"mullet_striped" +display_name = "striped mullet" +active = false +catalog_number = 6804 +collection_group = &"Temperate estuary" +logbook_fact = "striped mullet leap clear of the water and travel in coastal schools. they graze algae and detritus with specialized digestive systems." +allowed_water_types = 3 +rarity = 0 +base_catch_weight = 2.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 8.0 +sell_value_min = 3 +sell_value_max = 8 +sell_value_curve = 0.92 diff --git a/fish/species/muskellunge/muskellunge.tres b/fish/species/muskellunge/muskellunge.tres new file mode 100644 index 0000000..84c8513 --- /dev/null +++ b/fish/species/muskellunge/muskellunge.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"muskellunge" +display_name = "muskellunge" +active = false +catalog_number = 2704 +collection_group = &"Freshwater giants" +logbook_fact = "muskellunge wait motionless among weeds before exploding toward prey. pale bodies carry bars or spots that fade into broken underwater light." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.11 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 8.0 +weight_max_lb = 60.0 +sell_value_min = 32 +sell_value_max = 72 +sell_value_curve = 0.82 diff --git a/fish/species/nautilus_chambered/nautilus_chambered.tres b/fish/species/nautilus_chambered/nautilus_chambered.tres new file mode 100644 index 0000000..fd6189c --- /dev/null +++ b/fish/species/nautilus_chambered/nautilus_chambered.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"nautilus_chambered" +display_name = "chambered nautilus" +active = false +catalog_number = 1501 +collection_group = &"Cuttlefish and nautiluses" +logbook_fact = "chambered nautiluses regulate buoyancy with gas-filled shell chambers. dozens of small tentacles feel for food in dark reef slopes." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.05 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 3.0 +sell_value_min = 34 +sell_value_max = 76 +sell_value_curve = 0.92 diff --git a/fish/species/needlefish_hound/needlefish_hound.tres b/fish/species/needlefish_hound/needlefish_hound.tres new file mode 100644 index 0000000..ecb8226 --- /dev/null +++ b/fish/species/needlefish_hound/needlefish_hound.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"needlefish_hound" +display_name = "houndfish" +active = false +catalog_number = 6602 +collection_group = &"Surface ocean fish" +logbook_fact = "houndfish hunt near the surface with long jaws filled with fine teeth. powerful leaps can carry their narrow bodies far above the water." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 10.0 +sell_value_min = 11 +sell_value_max = 25 +sell_value_curve = 0.88 diff --git a/fish/species/oarfish_giant/oarfish_giant.tres b/fish/species/oarfish_giant/oarfish_giant.tres new file mode 100644 index 0000000..f34adcc --- /dev/null +++ b/fish/species/oarfish_giant/oarfish_giant.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"oarfish_giant" +display_name = "giant oarfish" +active = false +catalog_number = 1701 +collection_group = &"Deep-sea legends" +logbook_fact = "giant oarfish drift vertically through deep open water, rowing with a crimson dorsal fin. their ribbon-like bodies can reach remarkable lengths." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.035 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 20.0 +weight_max_lb = 600.0 +sell_value_min = 60 +sell_value_max = 140 +sell_value_curve = 0.78 diff --git a/fish/species/ocean_perch_pacific/ocean_perch_pacific.tres b/fish/species/ocean_perch_pacific/ocean_perch_pacific.tres new file mode 100644 index 0000000..a7f9873 --- /dev/null +++ b/fish/species/ocean_perch_pacific/ocean_perch_pacific.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"ocean_perch_pacific" +display_name = "Pacific ocean perch" +active = false +catalog_number = 1603 +collection_group = &"Deep shelf fish" +logbook_fact = "pacific ocean perch hover around deep rocky reefs in the north pacific. these slow-growing fish give birth to live young." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 12.0 +sell_value_min = 7 +sell_value_max = 17 +sell_value_curve = 0.88 diff --git a/fish/species/octopus_common/octopus_common.tres b/fish/species/octopus_common/octopus_common.tres new file mode 100644 index 0000000..b86950e --- /dev/null +++ b/fish/species/octopus_common/octopus_common.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"octopus_common" +display_name = "common octopus" +active = false +catalog_number = 4901 +collection_group = &"Octopuses" +logbook_fact = "common octopuses squeeze through narrow cracks and solve problems while hunting reefs. skin cells rapidly change color and texture." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.65 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 22.0 +sell_value_min = 7 +sell_value_max = 18 +sell_value_curve = 0.87 diff --git a/fish/species/octopus_day/octopus_day.tres b/fish/species/octopus_day/octopus_day.tres new file mode 100644 index 0000000..aada4c1 --- /dev/null +++ b/fish/species/octopus_day/octopus_day.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"octopus_day" +display_name = "day octopus" +active = false +catalog_number = 4902 +collection_group = &"Octopuses" +logbook_fact = "day octopuses forage across tropical reefs while the sun is high. shifting bars and spots communicate alarm, camouflage, and threat." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 15.0 +sell_value_min = 15 +sell_value_max = 36 +sell_value_curve = 0.88 diff --git a/fish/species/octopus_giant_pacific/octopus_giant_pacific.tres b/fish/species/octopus_giant_pacific/octopus_giant_pacific.tres new file mode 100644 index 0000000..09aca6d --- /dev/null +++ b/fish/species/octopus_giant_pacific/octopus_giant_pacific.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"octopus_giant_pacific" +display_name = "giant Pacific octopus" +active = false +catalog_number = 4903 +collection_group = &"Octopuses" +logbook_fact = "giant pacific octopuses explore cold rocky dens with thousands of arm suckers. females guard their eggs without feeding until they hatch." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 200.0 +sell_value_min = 28 +sell_value_max = 70 +sell_value_curve = 0.81 diff --git a/fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres b/fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres new file mode 100644 index 0000000..a59bd06 --- /dev/null +++ b/fish/species/octopus_greater_blue_ringed/octopus_greater_blue_ringed.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"octopus_greater_blue_ringed" +display_name = "greater blue-ringed octopus" +active = false +catalog_number = 4904 +collection_group = &"Octopuses" +logbook_fact = "greater blue-ringed octopuses reveal vivid rings when threatened. a tiny beak can deliver venom strong enough to stop breathing." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.04 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.3 +sell_value_min = 38 +sell_value_max = 82 +sell_value_curve = 0.96 diff --git a/fish/species/opah/opah.tres b/fish/species/opah/opah.tres new file mode 100644 index 0000000..2bb4231 --- /dev/null +++ b/fish/species/opah/opah.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"opah" +display_name = "opah" +active = false +catalog_number = 4702 +collection_group = &"Oceanic pelagic fish" +logbook_fact = "opah circulate warm blood through much of the body, an unusual trait among fish. round silver flanks glow with red fins and pale spots." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.09 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 20.0 +weight_max_lb = 600.0 +sell_value_min = 36 +sell_value_max = 88 +sell_value_curve = 0.8 diff --git a/fish/species/oscar/oscar.tres b/fish/species/oscar/oscar.tres new file mode 100644 index 0000000..d3da024 --- /dev/null +++ b/fish/species/oscar/oscar.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"oscar" +display_name = "oscar" +active = false +catalog_number = 7507 +collection_group = &"Tropical freshwater fish" +logbook_fact = "oscars are large south american cichlids that recognize routines and defend territories. a tail eyespot may redirect attacks away from the head." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 4.0 +sell_value_min = 6 +sell_value_max = 14 +sell_value_curve = 0.9 diff --git a/fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres b/fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres new file mode 100644 index 0000000..cc95d74 --- /dev/null +++ b/fish/species/oyster_black_lip_pearl/oyster_black_lip_pearl.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"oyster_black_lip_pearl" +display_name = "black-lip pearl oyster" +active = false +catalog_number = 6401 +collection_group = &"Shellfish" +logbook_fact = "black-lip pearl oysters line their shells with dark-edged nacre. a trapped irritant can become coated in the same pearly material." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.22 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 5.0 +sell_value_min = 14 +sell_value_max = 40 +sell_value_curve = 0.91 diff --git a/fish/species/paddlefish/paddlefish.tres b/fish/species/paddlefish/paddlefish.tres new file mode 100644 index 0000000..c9d4925 --- /dev/null +++ b/fish/species/paddlefish/paddlefish.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"paddlefish" +display_name = "paddlefish" +active = false +catalog_number = 104 +collection_group = &"Ancient freshwater fish" +logbook_fact = "paddlefish cruise open rivers with their mouths wide, filtering tiny plankton from the water. the broad snout senses faint electrical signals." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 10.0 +weight_max_lb = 120.0 +sell_value_min = 34 +sell_value_max = 76 +sell_value_curve = 0.82 diff --git a/fish/species/parrotfish_rainbow/parrotfish_rainbow.tres b/fish/species/parrotfish_rainbow/parrotfish_rainbow.tres new file mode 100644 index 0000000..3320b61 --- /dev/null +++ b/fish/species/parrotfish_rainbow/parrotfish_rainbow.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"parrotfish_rainbow" +display_name = "rainbow parrotfish" +active = false +catalog_number = 5502 +collection_group = &"Reef grazers" +logbook_fact = "rainbow parrotfish scrape algae from reefs with fused beak-like teeth. crushed coral passes through them and returns to the reef as sand." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.12 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 40.0 +sell_value_min = 25 +sell_value_max = 58 +sell_value_curve = 0.84 diff --git a/fish/species/parrotfish_stoplight/parrotfish_stoplight.tres b/fish/species/parrotfish_stoplight/parrotfish_stoplight.tres new file mode 100644 index 0000000..2392e88 --- /dev/null +++ b/fish/species/parrotfish_stoplight/parrotfish_stoplight.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"parrotfish_stoplight" +display_name = "stoplight parrotfish" +active = false +catalog_number = 5503 +collection_group = &"Reef grazers" +logbook_fact = "stoplight parrotfish change color dramatically as they mature. powerful dental plates bite algae from hard reef surfaces." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 15.0 +sell_value_min = 12 +sell_value_max = 29 +sell_value_curve = 0.88 diff --git a/fish/species/peacock_bass/peacock_bass.tres b/fish/species/peacock_bass/peacock_bass.tres new file mode 100644 index 0000000..39487fe --- /dev/null +++ b/fish/species/peacock_bass/peacock_bass.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"peacock_bass" +display_name = "peacock bass" +active = false +catalog_number = 7604 +collection_group = &"Tropical freshwater predators" +logbook_fact = "peacock bass are aggressive south american cichlids rather than true bass. adults guard nests and hunt fish in warm clear water." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 25.0 +sell_value_min = 15 +sell_value_max = 36 +sell_value_curve = 0.84 diff --git a/fish/species/permit/permit.tres b/fish/species/permit/permit.tres new file mode 100644 index 0000000..bd36724 --- /dev/null +++ b/fish/species/permit/permit.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"permit" +display_name = "permit" +active = false +catalog_number = 7404 +collection_group = &"Tropical flats fish" +logbook_fact = "permit browse tropical flats for crabs and shellfish with rubbery mouths. tall silver bodies carry long sickle-shaped dorsal and anal fins." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.11 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 3.0 +weight_max_lb = 50.0 +sell_value_min = 27 +sell_value_max = 62 +sell_value_curve = 0.84 diff --git a/fish/species/pickerel_chain/pickerel_chain.tres b/fish/species/pickerel_chain/pickerel_chain.tres new file mode 100644 index 0000000..f69ab5f --- /dev/null +++ b/fish/species/pickerel_chain/pickerel_chain.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"pickerel_chain" +display_name = "chain pickerel" +active = false +catalog_number = 3301 +collection_group = &"Freshwater predators" +logbook_fact = "chain pickerel hover among vegetation before darting at fish and frogs. a chain-like pattern breaks up their green flanks." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 9.0 +sell_value_min = 6 +sell_value_max = 15 +sell_value_curve = 0.9 diff --git a/fish/species/pickerel_grass/pickerel_grass.tres b/fish/species/pickerel_grass/pickerel_grass.tres new file mode 100644 index 0000000..ef59b58 --- /dev/null +++ b/fish/species/pickerel_grass/pickerel_grass.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"pickerel_grass" +display_name = "grass pickerel" +active = false +catalog_number = 3302 +collection_group = &"Freshwater predators" +logbook_fact = "grass pickerel remain small enough to hunt in narrow, weedy creeks and marshes. dark bars camouflage their slim bodies among stems." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 1.5 +sell_value_min = 2 +sell_value_max = 6 +sell_value_curve = 0.95 diff --git a/fish/species/pike_northern/pike_northern.tres b/fish/species/pike_northern/pike_northern.tres new file mode 100644 index 0000000..eb4dc5d --- /dev/null +++ b/fish/species/pike_northern/pike_northern.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"pike_northern" +display_name = "northern pike" +active = false +catalog_number = 3303 +collection_group = &"Freshwater predators" +logbook_fact = "northern pike are solitary ambush hunters built for sudden acceleration. pale bean-shaped spots cover their long green bodies." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.75 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 30.0 +sell_value_min = 8 +sell_value_max = 24 +sell_value_curve = 0.85 diff --git a/fish/species/pipefish_bay/pipefish_bay.tres b/fish/species/pipefish_bay/pipefish_bay.tres new file mode 100644 index 0000000..f5582c4 --- /dev/null +++ b/fish/species/pipefish_bay/pipefish_bay.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"pipefish_bay" +display_name = "bay pipefish" +active = false +catalog_number = 601 +collection_group = &"Coastal oddities" +logbook_fact = "bay pipefish hide upright among seagrass, matching the blades with their slender bodies. males carry developing eggs in a brood pouch." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.9 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.005 +weight_max_lb = 0.04 +sell_value_min = 4 +sell_value_max = 9 +sell_value_curve = 1.0 diff --git a/fish/species/piranha_red_bellied/piranha_red_bellied.tres b/fish/species/piranha_red_bellied/piranha_red_bellied.tres new file mode 100644 index 0000000..efca0b8 --- /dev/null +++ b/fish/species/piranha_red_bellied/piranha_red_bellied.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"piranha_red_bellied" +display_name = "red-bellied piranha" +active = false +catalog_number = 7605 +collection_group = &"Tropical freshwater predators" +logbook_fact = "red-bellied piranhas communicate with barks and drum-like sounds. schools provide protection as they search for fish, insects, and carrion." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 4.0 +sell_value_min = 12 +sell_value_max = 27 +sell_value_curve = 0.9 diff --git a/fish/species/plaice_european/plaice_european.tres b/fish/species/plaice_european/plaice_european.tres new file mode 100644 index 0000000..9e9be9a --- /dev/null +++ b/fish/species/plaice_european/plaice_european.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"plaice_european" +display_name = "European plaice" +active = false +catalog_number = 401 +collection_group = &"Coastal flatfish" +logbook_fact = "european plaice lie flat on the seafloor with both eyes on the same side. orange spots help distinguish them from neighboring flatfish." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 10.0 +sell_value_min = 4 +sell_value_max = 10 +sell_value_curve = 0.9 diff --git a/fish/species/pollock_alaska/pollock_alaska.tres b/fish/species/pollock_alaska/pollock_alaska.tres new file mode 100644 index 0000000..0e4af05 --- /dev/null +++ b/fish/species/pollock_alaska/pollock_alaska.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"pollock_alaska" +display_name = "Alaska pollock" +active = false +catalog_number = 1401 +collection_group = &"Cold shelf fish" +logbook_fact = "alaska pollock form vast schools over cold northern shelves. they feed on plankton and fish while supporting many larger predators." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 8.0 +sell_value_min = 3 +sell_value_max = 8 +sell_value_curve = 0.92 diff --git a/fish/species/pollock_atlantic/pollock_atlantic.tres b/fish/species/pollock_atlantic/pollock_atlantic.tres new file mode 100644 index 0000000..7d50342 --- /dev/null +++ b/fish/species/pollock_atlantic/pollock_atlantic.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"pollock_atlantic" +display_name = "Atlantic pollock" +active = false +catalog_number = 1403 +collection_group = &"Cold shelf fish" +logbook_fact = "atlantic pollock are swift relatives of cod with dark backs and pale lateral lines. adults gather around rocky banks and wrecks." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.9 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 35.0 +sell_value_min = 7 +sell_value_max = 18 +sell_value_curve = 0.86 diff --git a/fish/species/pomfret_black/pomfret_black.tres b/fish/species/pomfret_black/pomfret_black.tres index 8020100..d3e73d6 100644 --- a/fish/species/pomfret_black/pomfret_black.tres +++ b/fish/species/pomfret_black/pomfret_black.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"pomfret_black" display_name = "black pomfret" +active = true +catalog_number = 803 +collection_group = &"Coastal schooling fish" +logbook_fact = "black pomfret have a deep, laterally compressed body that lets them maneuver neatly through open water." allowed_water_types = 2 rarity = 1 base_catch_weight = 0.3 diff --git a/fish/species/pomfret_chinese/pomfret_chinese.tres b/fish/species/pomfret_chinese/pomfret_chinese.tres index 2eaf34b..76d6943 100644 --- a/fish/species/pomfret_chinese/pomfret_chinese.tres +++ b/fish/species/pomfret_chinese/pomfret_chinese.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"pomfret_chinese" display_name = "chinese pomfret" +active = true +catalog_number = 804 +collection_group = &"Coastal schooling fish" +logbook_fact = "chinese pomfret are silvery schooling fish with a tall, flattened body and long sickle-shaped fins." allowed_water_types = 2 rarity = 1 base_catch_weight = 0.3 diff --git a/fish/species/pomfret_golden/pomfret_golden.tres b/fish/species/pomfret_golden/pomfret_golden.tres index da1f561..8637db1 100644 --- a/fish/species/pomfret_golden/pomfret_golden.tres +++ b/fish/species/pomfret_golden/pomfret_golden.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"pomfret_golden" display_name = "golden pomfret" +active = true +catalog_number = 807 +collection_group = &"Coastal schooling fish" +logbook_fact = "golden pomfret are warm-water swimmers whose golden sheen is most noticeable along the fins and flanks." allowed_water_types = 2 rarity = 2 base_catch_weight = 0.18 diff --git a/fish/species/pomfret_white/pomfret_white.tres b/fish/species/pomfret_white/pomfret_white.tres index fa317c7..7152086 100644 --- a/fish/species/pomfret_white/pomfret_white.tres +++ b/fish/species/pomfret_white/pomfret_white.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"pomfret_white" display_name = "white pomfret" +active = true +catalog_number = 810 +collection_group = &"Coastal schooling fish" +logbook_fact = "white pomfret gather over coastal grounds and use their compact, deep bodies to turn quickly while feeding." allowed_water_types = 2 base_catch_weight = 0.45 catch_profile = ExtResource("2_profile") diff --git a/fish/species/pompano_african/pompano_african.tres b/fish/species/pompano_african/pompano_african.tres new file mode 100644 index 0000000..0b73340 --- /dev/null +++ b/fish/species/pompano_african/pompano_african.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"pompano_african" +display_name = "African pompano" +active = false +catalog_number = 3601 +collection_group = &"Large coastal predators" +logbook_fact = "african pompano develop long streaming fin rays while young. adults become deep-bodied silver hunters around reefs and offshore structure." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.26 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 50.0 +sell_value_min = 14 +sell_value_max = 35 +sell_value_curve = 0.84 diff --git a/fish/species/pompano_florida/pompano_florida.tres b/fish/species/pompano_florida/pompano_florida.tres new file mode 100644 index 0000000..be7a10e --- /dev/null +++ b/fish/species/pompano_florida/pompano_florida.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"pompano_florida" +display_name = "Florida pompano" +active = false +catalog_number = 7402 +collection_group = &"Tropical flats fish" +logbook_fact = "florida pompano search warm surf for crabs, clams, and sand fleas. short blunt snouts lead into deep, silvery bodies." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.85 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 9.0 +sell_value_min = 7 +sell_value_max = 16 +sell_value_curve = 0.88 diff --git a/fish/species/porcupinefish_spotted/porcupinefish_spotted.tres b/fish/species/porcupinefish_spotted/porcupinefish_spotted.tres new file mode 100644 index 0000000..1e51582 --- /dev/null +++ b/fish/species/porcupinefish_spotted/porcupinefish_spotted.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"porcupinefish_spotted" +display_name = "spotted porcupinefish" +active = false +catalog_number = 5607 +collection_group = &"Reef oddities" +logbook_fact = "spotted porcupinefish inflate until long spines stand outward. fused teeth form a strong beak for crushing shelled prey." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.12 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 7.0 +sell_value_min = 24 +sell_value_max = 54 +sell_value_curve = 0.9 diff --git a/fish/species/porgy_scup/porgy_scup.tres b/fish/species/porgy_scup/porgy_scup.tres new file mode 100644 index 0000000..dec3c55 --- /dev/null +++ b/fish/species/porgy_scup/porgy_scup.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"porgy_scup" +display_name = "scup" +active = false +catalog_number = 6904 +collection_group = &"Temperate reef fish" +logbook_fact = "scup use small strong teeth to crush shellfish and other bottom prey. deep silver bodies gather around piers, reefs, and eelgrass." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 2.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 5.0 +sell_value_min = 3 +sell_value_max = 8 +sell_value_curve = 0.92 diff --git a/fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres b/fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres new file mode 100644 index 0000000..3771896 --- /dev/null +++ b/fish/species/pufferfish_guineafowl/pufferfish_guineafowl.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"pufferfish_guineafowl" +display_name = "guineafowl puffer" +active = false +catalog_number = 5603 +collection_group = &"Reef oddities" +logbook_fact = "guineafowl puffers swallow water to inflate when threatened. adults may shift from a spotted dark pattern to a vivid yellow form." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 5.0 +sell_value_min = 11 +sell_value_max = 26 +sell_value_curve = 0.9 diff --git a/fish/species/pumpkinseed/pumpkinseed.tres b/fish/species/pumpkinseed/pumpkinseed.tres new file mode 100644 index 0000000..5a24e96 --- /dev/null +++ b/fish/species/pumpkinseed/pumpkinseed.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"pumpkinseed" +display_name = "pumpkinseed" +active = false +catalog_number = 3104 +collection_group = &"Freshwater panfish" +logbook_fact = "pumpkinseeds use compact teeth to crush snails and other hard prey. blue facial lines and an orange gill spot brighten their round bodies." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 3.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 1.3 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 1.0 diff --git a/fish/species/queenfish_talang/queenfish_talang.tres b/fish/species/queenfish_talang/queenfish_talang.tres new file mode 100644 index 0000000..6b3f91c --- /dev/null +++ b/fish/species/queenfish_talang/queenfish_talang.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"queenfish_talang" +display_name = "talang queenfish" +active = false +catalog_number = 708 +collection_group = &"Coastal pelagic fish" +logbook_fact = "talang queenfish chase schooling prey near warm coasts and estuaries. hooked teeth and a deeply forked tail suit their rapid attacks." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 20.0 +sell_value_min = 7 +sell_value_max = 18 +sell_value_curve = 0.86 diff --git a/fish/species/quillback/quillback.tres b/fish/species/quillback/quillback.tres new file mode 100644 index 0000000..915fc08 --- /dev/null +++ b/fish/species/quillback/quillback.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"quillback" +display_name = "quillback" +active = false +catalog_number = 2303 +collection_group = &"Freshwater bottom fish" +logbook_fact = "quillbacks carry a long first dorsal ray that rises like a quill. small mouths gather insect larvae and other food from river and lake bottoms." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 15.0 +sell_value_min = 6 +sell_value_max = 16 +sell_value_curve = 0.88 diff --git a/fish/species/red_drum/red_drum.tres b/fish/species/red_drum/red_drum.tres new file mode 100644 index 0000000..98c6bdd --- /dev/null +++ b/fish/species/red_drum/red_drum.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"red_drum" +display_name = "red drum" +active = false +catalog_number = 6803 +collection_group = &"Temperate estuary" +logbook_fact = "red drum use powerful tails to patrol surf and estuaries. one or more black spots near the tail may confuse predators about which end is the head." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.75 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 45.0 +sell_value_min = 8 +sell_value_max = 23 +sell_value_curve = 0.84 diff --git a/fish/species/redear_sunfish/redear_sunfish.tres b/fish/species/redear_sunfish/redear_sunfish.tres new file mode 100644 index 0000000..55221d8 --- /dev/null +++ b/fish/species/redear_sunfish/redear_sunfish.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"redear_sunfish" +display_name = "redear sunfish" +active = false +catalog_number = 3105 +collection_group = &"Freshwater panfish" +logbook_fact = "redear sunfish specialize in snails, crushing shells with strong throat teeth. a red or orange margin marks the dark flap behind the gill." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 1.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 3.0 +sell_value_min = 4 +sell_value_max = 9 +sell_value_curve = 0.95 diff --git a/fish/species/redhorse_golden/redhorse_golden.tres b/fish/species/redhorse_golden/redhorse_golden.tres new file mode 100644 index 0000000..15296d5 --- /dev/null +++ b/fish/species/redhorse_golden/redhorse_golden.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"redhorse_golden" +display_name = "golden redhorse" +active = false +catalog_number = 2302 +collection_group = &"Freshwater bottom fish" +logbook_fact = "golden redhorses probe flowing river bottoms with fleshy, downward-facing mouths. coppery scales and reddish fins give them a warm glow." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.9 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 8.0 +sell_value_min = 6 +sell_value_max = 14 +sell_value_curve = 0.9 diff --git a/fish/species/roach_common/roach_common.tres b/fish/species/roach_common/roach_common.tres new file mode 100644 index 0000000..a85b58f --- /dev/null +++ b/fish/species/roach_common/roach_common.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"roach_common" +display_name = "common roach" +active = false +catalog_number = 2504 +collection_group = &"Freshwater coarse fish" +logbook_fact = "common roach thrive in many lakes and rivers, often schooling near vegetation. red fins and a red-orange eye brighten their silver bodies." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 4.0 +sell_value_min = 2 +sell_value_max = 6 +sell_value_curve = 0.95 diff --git a/fish/species/rockfish_black/rockfish_black.tres b/fish/species/rockfish_black/rockfish_black.tres new file mode 100644 index 0000000..4bbcd5a --- /dev/null +++ b/fish/species/rockfish_black/rockfish_black.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"rockfish_black" +display_name = "black rockfish" +active = false +catalog_number = 6901 +collection_group = &"Temperate reef fish" +logbook_fact = "black rockfish gather above reefs and kelp along the north pacific coast. like other rockfish, they give birth to live young." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 10.0 +sell_value_min = 4 +sell_value_max = 11 +sell_value_curve = 0.9 diff --git a/fish/species/rockfish_canary/rockfish_canary.tres b/fish/species/rockfish_canary/rockfish_canary.tres new file mode 100644 index 0000000..2aeb290 --- /dev/null +++ b/fish/species/rockfish_canary/rockfish_canary.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"rockfish_canary" +display_name = "canary rockfish" +active = false +catalog_number = 6903 +collection_group = &"Temperate reef fish" +logbook_fact = "canary rockfish glow orange-yellow over deep pacific reefs. these long-lived fish mature slowly and give birth to live young." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 12.0 +sell_value_min = 7 +sell_value_max = 17 +sell_value_curve = 0.88 diff --git a/fish/species/rockfish_yelloweye/rockfish_yelloweye.tres b/fish/species/rockfish_yelloweye/rockfish_yelloweye.tres new file mode 100644 index 0000000..d06d1d3 --- /dev/null +++ b/fish/species/rockfish_yelloweye/rockfish_yelloweye.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"rockfish_yelloweye" +display_name = "yelloweye rockfish" +active = false +catalog_number = 6907 +collection_group = &"Temperate reef fish" +logbook_fact = "yelloweye rockfish can live for more than a century on deep pacific reefs. bright golden eyes stand out against orange-red bodies." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.09 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 35.0 +sell_value_min = 28 +sell_value_max = 64 +sell_value_curve = 0.84 diff --git a/fish/species/roosterfish/roosterfish.tres b/fish/species/roosterfish/roosterfish.tres new file mode 100644 index 0000000..fdb432a --- /dev/null +++ b/fish/species/roosterfish/roosterfish.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"roosterfish" +display_name = "roosterfish" +active = false +catalog_number = 7201 +collection_group = &"Tropical coastal predators" +logbook_fact = "roosterfish raise seven long dorsal spines while chasing prey through tropical surf. dark bands cross their sleek silver bodies." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.11 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 100.0 +sell_value_min = 30 +sell_value_max = 70 +sell_value_curve = 0.82 diff --git a/fish/species/rudd/rudd.tres b/fish/species/rudd/rudd.tres new file mode 100644 index 0000000..317fa8c --- /dev/null +++ b/fish/species/rudd/rudd.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"rudd" +display_name = "rudd" +active = false +catalog_number = 2508 +collection_group = &"Freshwater coarse fish" +logbook_fact = "rudd feed near the surface with an upturned mouth and red fins. golden-green bodies disappear easily among warm, weedy shallows." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.4 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 4.5 +sell_value_min = 3 +sell_value_max = 7 +sell_value_curve = 0.95 diff --git a/fish/species/sablefish/sablefish.tres b/fish/species/sablefish/sablefish.tres new file mode 100644 index 0000000..d180b9b --- /dev/null +++ b/fish/species/sablefish/sablefish.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sablefish" +display_name = "sablefish" +active = false +catalog_number = 1605 +collection_group = &"Deep shelf fish" +logbook_fact = "sablefish roam deep north pacific slopes and can live for many decades. soft dark bodies conceal rich, oil-filled flesh." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.22 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 40.0 +sell_value_min = 15 +sell_value_max = 36 +sell_value_curve = 0.84 diff --git a/fish/species/sailfish/sailfish.tres b/fish/species/sailfish/sailfish.tres index 7f6bea9..398f62d 100644 --- a/fish/species/sailfish/sailfish.tres +++ b/fish/species/sailfish/sailfish.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"sailfish" display_name = "sailfish" +active = true +catalog_number = 4603 +collection_group = &"Oceanic billfish" +logbook_fact = "sailfish raise their enormous dorsal fin while herding baitfish. they are among the fastest fish in the sea." allowed_water_types = 2 rarity = 3 base_catch_weight = 0.1 diff --git a/fish/species/salmon_atlantic/salmon_atlantic.tres b/fish/species/salmon_atlantic/salmon_atlantic.tres index fa3f0d6..906d86b 100644 --- a/fish/species/salmon_atlantic/salmon_atlantic.tres +++ b/fish/species/salmon_atlantic/salmon_atlantic.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"salmon_atlantic" display_name = "atlantic salmon" +active = true +catalog_number = 4401 +collection_group = &"Ocean-run salmon" +logbook_fact = "atlantic salmon can return from the ocean to the river where they hatched. unlike many salmon, some survive to make the trip again." allowed_water_types = 2 rarity = 3 base_catch_weight = 0.65 diff --git a/fish/species/salmon_chum/salmon_chum.tres b/fish/species/salmon_chum/salmon_chum.tres index 748295b..67d3684 100644 --- a/fish/species/salmon_chum/salmon_chum.tres +++ b/fish/species/salmon_chum/salmon_chum.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"salmon_chum" display_name = "chum salmon" +active = true +catalog_number = 4402 +collection_group = &"Ocean-run salmon" +logbook_fact = "chum salmon travel immense distances and develop striking bars when they return to fresh water to spawn." allowed_water_types = 2 rarity = 1 base_catch_weight = 2.5 diff --git a/fish/species/salmon_coho/salmon_coho.tres b/fish/species/salmon_coho/salmon_coho.tres index 1c1a783..ad51f7b 100644 --- a/fish/species/salmon_coho/salmon_coho.tres +++ b/fish/species/salmon_coho/salmon_coho.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"salmon_coho" display_name = "coho salmon" +active = true +catalog_number = 4403 +collection_group = &"Ocean-run salmon" +logbook_fact = "coho salmon are agile hunters known for powerful leaps. young coho may spend more than a year growing in streams." allowed_water_types = 2 rarity = 2 base_catch_weight = 1.4 diff --git a/fish/species/salmon_pink/salmon_pink.tres b/fish/species/salmon_pink/salmon_pink.tres index d390cf1..7f76c62 100644 --- a/fish/species/salmon_pink/salmon_pink.tres +++ b/fish/species/salmon_pink/salmon_pink.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"salmon_pink" display_name = "pink salmon" +active = true +catalog_number = 4404 +collection_group = &"Ocean-run salmon" +logbook_fact = "pink salmon usually follow a strict two-year life cycle. spawning males develop the hump that inspired their nickname." allowed_water_types = 2 rarity = 1 base_catch_weight = 3.0 diff --git a/fish/species/salmon_sockeye/salmon_sockeye.tres b/fish/species/salmon_sockeye/salmon_sockeye.tres index deeda39..04b75b3 100644 --- a/fish/species/salmon_sockeye/salmon_sockeye.tres +++ b/fish/species/salmon_sockeye/salmon_sockeye.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"salmon_sockeye" display_name = "sockeye salmon" +active = true +catalog_number = 4405 +collection_group = &"Ocean-run salmon" +logbook_fact = "sockeye salmon feed heavily on plankton at sea. adults turn vivid red as they return inland to spawn." allowed_water_types = 2 rarity = 2 base_catch_weight = 1.6 diff --git a/fish/species/sand_dollar/sand_dollar.tres b/fish/species/sand_dollar/sand_dollar.tres new file mode 100644 index 0000000..fd3f73c --- /dev/null +++ b/fish/species/sand_dollar/sand_dollar.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"sand_dollar" +display_name = "sand dollar" +active = false +catalog_number = 1904 +collection_group = &"Echinoderms" +logbook_fact = "sand dollars burrow just beneath sandy seafloors and filter tiny food particles. the familiar star pattern marks their five-part body plan." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.01 +weight_max_lb = 0.2 +sell_value_min = 4 +sell_value_max = 10 +sell_value_curve = 0.98 diff --git a/fish/species/sand_lance_american/sand_lance_american.tres b/fish/species/sand_lance_american/sand_lance_american.tres new file mode 100644 index 0000000..4f53bbb --- /dev/null +++ b/fish/species/sand_lance_american/sand_lance_american.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sand_lance_american" +display_name = "American sand lance" +active = false +catalog_number = 801 +collection_group = &"Coastal schooling fish" +logbook_fact = "american sand lance dive headfirst into loose sand when danger approaches. immense schools carry energy from plankton to larger predators." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 3.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.02 +weight_max_lb = 0.4 +sell_value_min = 1 +sell_value_max = 3 +sell_value_curve = 1.0 diff --git a/fish/species/sardine_european/sardine_european.tres b/fish/species/sardine_european/sardine_european.tres new file mode 100644 index 0000000..3052323 --- /dev/null +++ b/fish/species/sardine_european/sardine_european.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"sardine_european" +display_name = "European pilchard" +active = false +catalog_number = 806 +collection_group = &"Coastal schooling fish" +logbook_fact = "european pilchards form shimmering schools along atlantic and mediterranean coasts. they feed mainly on plankton near the surface." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 3.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.6 +sell_value_min = 2 +sell_value_max = 4 +sell_value_curve = 1.0 diff --git a/fish/species/sardine_pacific/sardine_pacific.tres b/fish/species/sardine_pacific/sardine_pacific.tres new file mode 100644 index 0000000..3e4db3d --- /dev/null +++ b/fish/species/sardine_pacific/sardine_pacific.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"sardine_pacific" +display_name = "Pacific sardine" +active = false +catalog_number = 809 +collection_group = &"Coastal schooling fish" +logbook_fact = "pacific sardines follow cool, productive water in enormous schools. their movements shift as currents and plankton supplies change." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 3.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.5 +sell_value_min = 2 +sell_value_max = 4 +sell_value_curve = 1.0 diff --git a/fish/species/sauger/sauger.tres b/fish/species/sauger/sauger.tres index 49cf5ad..0918236 100644 --- a/fish/species/sauger/sauger.tres +++ b/fish/species/sauger/sauger.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"sauger" display_name = "sauger" +active = true +catalog_number = 3304 +collection_group = &"Freshwater predators" +logbook_fact = "sauger favor turbid rivers and reservoirs. their mottled backs blend into the dim, shifting light near the bottom." allowed_water_types = 1 rarity = 1 base_catch_weight = 0.35 diff --git a/fish/species/saugeye/saugeye.tres b/fish/species/saugeye/saugeye.tres index e834005..ac82232 100644 --- a/fish/species/saugeye/saugeye.tres +++ b/fish/species/saugeye/saugeye.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"saugeye" display_name = "saugeye" +active = true +catalog_number = 3305 +collection_group = &"Freshwater predators" +logbook_fact = "saugeye are a fertile hybrid of sauger and walleye. they combine traits from both parent species and often grow quickly." allowed_water_types = 1 rarity = 2 base_catch_weight = 0.2 diff --git a/fish/species/sawfish_largetooth/sawfish_largetooth.tres b/fish/species/sawfish_largetooth/sawfish_largetooth.tres new file mode 100644 index 0000000..699c8d6 --- /dev/null +++ b/fish/species/sawfish_largetooth/sawfish_largetooth.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"sawfish_largetooth" +display_name = "largetooth sawfish" +active = false +catalog_number = 5103 +collection_group = &"Rays and skates" +logbook_fact = "largetooth sawfish detect hidden prey with a long sensory rostrum. a swift sideways sweep stuns fish and exposes animals buried in mud." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.035 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 25.0 +weight_max_lb = 1300.0 +sell_value_min = 58 +sell_value_max = 135 +sell_value_curve = 0.78 diff --git a/fish/species/scorpionfish_red/scorpionfish_red.tres b/fish/species/scorpionfish_red/scorpionfish_red.tres new file mode 100644 index 0000000..eda1241 --- /dev/null +++ b/fish/species/scorpionfish_red/scorpionfish_red.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"scorpionfish_red" +display_name = "red scorpionfish" +active = false +catalog_number = 5202 +collection_group = &"Reef ambush fish" +logbook_fact = "red scorpionfish vanish against rocky reefs through mottled color and skin flaps. venomous dorsal spines punish careless predators." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 7.0 +sell_value_min = 11 +sell_value_max = 25 +sell_value_curve = 0.9 diff --git a/fish/species/sea_bass_black/sea_bass_black.tres b/fish/species/sea_bass_black/sea_bass_black.tres new file mode 100644 index 0000000..0f4fca3 --- /dev/null +++ b/fish/species/sea_bass_black/sea_bass_black.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sea_bass_black" +display_name = "black sea bass" +active = false +catalog_number = 6902 +collection_group = &"Temperate reef fish" +logbook_fact = "black sea bass shelter around reefs, piers, and wrecks. many begin life as female and later become male." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 1.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 8.0 +sell_value_min = 4 +sell_value_max = 10 +sell_value_curve = 0.9 diff --git a/fish/species/sea_bass_chilean/sea_bass_chilean.tres b/fish/species/sea_bass_chilean/sea_bass_chilean.tres new file mode 100644 index 0000000..c52a88c --- /dev/null +++ b/fish/species/sea_bass_chilean/sea_bass_chilean.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sea_bass_chilean" +display_name = "Patagonian toothfish" +active = false +catalog_number = 1604 +collection_group = &"Deep shelf fish" +logbook_fact = "patagonian toothfish patrol cold, deep southern water with large canine teeth. natural antifreeze proteins protect their blood from freezing." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.09 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 10.0 +weight_max_lb = 220.0 +sell_value_min = 32 +sell_value_max = 78 +sell_value_curve = 0.8 diff --git a/fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres b/fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres new file mode 100644 index 0000000..5670862 --- /dev/null +++ b/fish/species/sea_cucumber_giant_california/sea_cucumber_giant_california.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"sea_cucumber_giant_california" +display_name = "giant California sea cucumber" +active = false +catalog_number = 1902 +collection_group = &"Echinoderms" +logbook_fact = "giant california sea cucumbers sweep organic particles from the seafloor with branching tentacles. soft tube feet anchor their long bodies." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 5.0 +sell_value_min = 13 +sell_value_max = 29 +sell_value_curve = 0.93 diff --git a/fish/species/sea_otter/sea_otter.tres b/fish/species/sea_otter/sea_otter.tres new file mode 100644 index 0000000..c7740a3 --- /dev/null +++ b/fish/species/sea_otter/sea_otter.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sea_otter" +display_name = "sea otter" +active = false +catalog_number = 503 +collection_group = &"Coastal marine mammals" +logbook_fact = "sea otters float on their backs while opening shellfish with stones. dense fur traps insulating air because they lack a thick blubber layer." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.02 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 30.0 +weight_max_lb = 100.0 +sell_value_min = 55 +sell_value_max = 125 +sell_value_curve = 0.84 diff --git a/fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres b/fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres new file mode 100644 index 0000000..bfc9493 --- /dev/null +++ b/fish/species/sea_star_crown_of_thorns/sea_star_crown_of_thorns.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"sea_star_crown_of_thorns" +display_name = "crown-of-thorns sea star" +active = false +catalog_number = 1901 +collection_group = &"Echinoderms" +logbook_fact = "crown-of-thorns sea stars crawl over reefs and digest coral tissue outside the body. venomous spines discourage many predators." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 7.0 +sell_value_min = 23 +sell_value_max = 52 +sell_value_curve = 0.91 diff --git a/fish/species/sea_star_sunflower/sea_star_sunflower.tres b/fish/species/sea_star_sunflower/sea_star_sunflower.tres new file mode 100644 index 0000000..7409a31 --- /dev/null +++ b/fish/species/sea_star_sunflower/sea_star_sunflower.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"sea_star_sunflower" +display_name = "sunflower sea star" +active = false +catalog_number = 1905 +collection_group = &"Echinoderms" +logbook_fact = "sunflower sea stars move quickly on thousands of tube feet and may carry many arms. they hunt urchins, clams, and other bottom animals." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 13.0 +sell_value_min = 14 +sell_value_max = 32 +sell_value_curve = 0.89 diff --git a/fish/species/seadragon_leafy/seadragon_leafy.tres b/fish/species/seadragon_leafy/seadragon_leafy.tres new file mode 100644 index 0000000..b137a34 --- /dev/null +++ b/fish/species/seadragon_leafy/seadragon_leafy.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"seadragon_leafy" +display_name = "leafy seadragon" +active = false +catalog_number = 6301 +collection_group = &"Seahorses and seadragons" +logbook_fact = "leafy seadragons drift among seaweed with elaborate skin lobes that resemble leaves. males carry eggs beneath the tail." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 0.5 +sell_value_min = 24 +sell_value_max = 55 +sell_value_curve = 0.94 diff --git a/fish/species/seadragon_weedy/seadragon_weedy.tres b/fish/species/seadragon_weedy/seadragon_weedy.tres new file mode 100644 index 0000000..e388f50 --- /dev/null +++ b/fish/species/seadragon_weedy/seadragon_weedy.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"seadragon_weedy" +display_name = "weedy seadragon" +active = false +catalog_number = 6302 +collection_group = &"Seahorses and seadragons" +logbook_fact = "weedy seadragons rely on slender bodies and small leaf-like lobes for camouflage. males brood rows of eggs on the underside of the tail." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.22 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 0.6 +sell_value_min = 16 +sell_value_max = 38 +sell_value_curve = 0.93 diff --git a/fish/species/seahorse_lined/seahorse_lined.tres b/fish/species/seahorse_lined/seahorse_lined.tres new file mode 100644 index 0000000..42fe3e3 --- /dev/null +++ b/fish/species/seahorse_lined/seahorse_lined.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"seahorse_lined" +display_name = "lined seahorse" +active = false +catalog_number = 602 +collection_group = &"Coastal oddities" +logbook_fact = "lined seahorses anchor to grass and coral with curling tails. the male broods eggs in a pouch and releases fully formed young." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.005 +weight_max_lb = 0.05 +sell_value_min = 9 +sell_value_max = 20 +sell_value_curve = 1.0 diff --git a/fish/species/seal_harbor/seal_harbor.tres b/fish/species/seal_harbor/seal_harbor.tres new file mode 100644 index 0000000..59bdf2b --- /dev/null +++ b/fish/species/seal_harbor/seal_harbor.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"seal_harbor" +display_name = "harbor seal" +active = false +catalog_number = 502 +collection_group = &"Coastal marine mammals" +logbook_fact = "harbor seals rest on rocky shores and sandbars between hunting trips. sensitive whiskers can trace the water trails left by moving fish." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.018 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 120.0 +weight_max_lb = 370.0 +sell_value_min = 60 +sell_value_max = 140 +sell_value_curve = 0.79 diff --git a/fish/species/shark_blacktip/shark_blacktip.tres b/fish/species/shark_blacktip/shark_blacktip.tres new file mode 100644 index 0000000..99bc169 --- /dev/null +++ b/fish/species/shark_blacktip/shark_blacktip.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"shark_blacktip" +display_name = "blacktip shark" +active = false +catalog_number = 901 +collection_group = &"Coastal sharks" +logbook_fact = "blacktip sharks are named for the dark markings on their fins. they hunt schooling fish in warm shallows and sometimes leap clear of the water." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 15.0 +weight_max_lb = 150.0 +sell_value_min = 32 +sell_value_max = 75 +sell_value_curve = 0.8 diff --git a/fish/species/shark_great_hammerhead/shark_great_hammerhead.tres b/fish/species/shark_great_hammerhead/shark_great_hammerhead.tres new file mode 100644 index 0000000..65b9d96 --- /dev/null +++ b/fish/species/shark_great_hammerhead/shark_great_hammerhead.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"shark_great_hammerhead" +display_name = "great hammerhead shark" +active = false +catalog_number = 902 +collection_group = &"Coastal sharks" +logbook_fact = "great hammerheads sweep their wide heads over the bottom while searching for rays. widely spaced senses help pinpoint hidden prey." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.035 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 50.0 +weight_max_lb = 1000.0 +sell_value_min = 62 +sell_value_max = 145 +sell_value_curve = 0.78 diff --git a/fish/species/shark_great_white/shark_great_white.tres b/fish/species/shark_great_white/shark_great_white.tres new file mode 100644 index 0000000..560b596 --- /dev/null +++ b/fish/species/shark_great_white/shark_great_white.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"shark_great_white" +display_name = "great white shark" +active = false +catalog_number = 903 +collection_group = &"Coastal sharks" +logbook_fact = "great white sharks conserve heat in their swimming muscles while crossing cool seas. rows of serrated teeth are replaced throughout life." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.025 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 100.0 +weight_max_lb = 1000.0 +sell_value_min = 70 +sell_value_max = 150 +sell_value_curve = 0.76 diff --git a/fish/species/shark_tiger/shark_tiger.tres b/fish/species/shark_tiger/shark_tiger.tres new file mode 100644 index 0000000..a3f34f7 --- /dev/null +++ b/fish/species/shark_tiger/shark_tiger.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"shark_tiger" +display_name = "tiger shark" +active = false +catalog_number = 904 +collection_group = &"Coastal sharks" +logbook_fact = "tiger sharks carry dark vertical bars that fade as they mature. broad jaws let them investigate an unusually varied range of prey." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.06 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 50.0 +weight_max_lb = 1000.0 +sell_value_min = 50 +sell_value_max = 120 +sell_value_curve = 0.8 diff --git a/fish/species/shark_whale/shark_whale.tres b/fish/species/shark_whale/shark_whale.tres new file mode 100644 index 0000000..b0bbe19 --- /dev/null +++ b/fish/species/shark_whale/shark_whale.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"shark_whale" +display_name = "whale shark" +active = false +catalog_number = 905 +collection_group = &"Coastal sharks" +logbook_fact = "whale sharks are enormous filter feeders covered in unique spot patterns. they cruise with open mouths to collect plankton and tiny fish." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.025 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 500.0 +weight_max_lb = 45000.0 +sell_value_min = 70 +sell_value_max = 160 +sell_value_curve = 0.76 diff --git a/fish/species/sheepshead/sheepshead.tres b/fish/species/sheepshead/sheepshead.tres new file mode 100644 index 0000000..df76f08 --- /dev/null +++ b/fish/species/sheepshead/sheepshead.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sheepshead" +display_name = "sheepshead" +active = false +catalog_number = 6905 +collection_group = &"Temperate reef fish" +logbook_fact = "sheepshead carry flat human-like front teeth for biting barnacles and crabs. dark bars cross their high silver bodies." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.75 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 20.0 +sell_value_min = 7 +sell_value_max = 18 +sell_value_curve = 0.86 diff --git a/fish/species/shiner_common/shiner_common.tres b/fish/species/shiner_common/shiner_common.tres new file mode 100644 index 0000000..505bb24 --- /dev/null +++ b/fish/species/shiner_common/shiner_common.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"shiner_common" +display_name = "common shiner" +active = false +catalog_number = 2801 +collection_group = &"Freshwater minnows" +logbook_fact = "common shiners flash silver in clear streams and small rivers. breeding males develop rosy fins and a blue-violet sheen." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 4.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.03 +weight_max_lb = 0.3 +sell_value_min = 1 +sell_value_max = 3 +sell_value_curve = 1.0 diff --git a/fish/species/shiner_emerald/shiner_emerald.tres b/fish/species/shiner_emerald/shiner_emerald.tres new file mode 100644 index 0000000..7497ae6 --- /dev/null +++ b/fish/species/shiner_emerald/shiner_emerald.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"shiner_emerald" +display_name = "emerald shiner" +active = false +catalog_number = 2803 +collection_group = &"Freshwater minnows" +logbook_fact = "emerald shiners form bright surface schools in large lakes and rivers. slender bodies feed on plankton and drifting insects." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 3.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.03 +weight_max_lb = 0.25 +sell_value_min = 1 +sell_value_max = 3 +sell_value_curve = 1.0 diff --git a/fish/species/shiner_golden/shiner_golden.tres b/fish/species/shiner_golden/shiner_golden.tres new file mode 100644 index 0000000..755bffb --- /dev/null +++ b/fish/species/shiner_golden/shiner_golden.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"shiner_golden" +display_name = "golden shiner" +active = false +catalog_number = 2806 +collection_group = &"Freshwater minnows" +logbook_fact = "golden shiners school around dense vegetation in warm water. an upturned mouth takes insects and plankton from near the surface." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 3.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 1.0 +sell_value_min = 2 +sell_value_max = 4 +sell_value_curve = 1.0 diff --git a/fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres b/fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres new file mode 100644 index 0000000..4a12b76 --- /dev/null +++ b/fish/species/shrimp_peacock_mantis/shrimp_peacock_mantis.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"shrimp_peacock_mantis" +display_name = "peacock mantis shrimp" +active = false +catalog_number = 3804 +collection_group = &"Lobsters and shrimp" +logbook_fact = "peacock mantis shrimp strike hard-shelled prey with club-like limbs. complex eyes move independently and detect colors beyond human vision." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.4 +sell_value_min = 22 +sell_value_max = 50 +sell_value_curve = 0.96 diff --git a/fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres b/fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres new file mode 100644 index 0000000..9ab3908 --- /dev/null +++ b/fish/species/shrimp_skunk_cleaner/shrimp_skunk_cleaner.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"shrimp_skunk_cleaner" +display_name = "skunk cleaner shrimp" +active = false +catalog_number = 3805 +collection_group = &"Lobsters and shrimp" +logbook_fact = "skunk cleaner shrimp advertise at reef cleaning stations with bright white antennae. visiting fish pause while parasites are picked away." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.75 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.01 +weight_max_lb = 0.15 +sell_value_min = 5 +sell_value_max = 11 +sell_value_curve = 0.98 diff --git a/fish/species/skate_barndoor/skate_barndoor.tres b/fish/species/skate_barndoor/skate_barndoor.tres new file mode 100644 index 0000000..013fc2f --- /dev/null +++ b/fish/species/skate_barndoor/skate_barndoor.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"skate_barndoor" +display_name = "barndoor skate" +active = false +catalog_number = 5101 +collection_group = &"Rays and skates" +logbook_fact = "barndoor skates glide over cold atlantic bottoms with broad wing-like fins. rows of thorny spines protect the back and tail." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 150.0 +sell_value_min = 28 +sell_value_max = 68 +sell_value_curve = 0.8 diff --git a/fish/species/smallmouth_bass/smallmouth_bass.tres b/fish/species/smallmouth_bass/smallmouth_bass.tres new file mode 100644 index 0000000..11e876f --- /dev/null +++ b/fish/species/smallmouth_bass/smallmouth_bass.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"smallmouth_bass" +display_name = "smallmouth bass" +active = false +catalog_number = 2202 +collection_group = &"Freshwater bass" +logbook_fact = "smallmouth bass favor clear water with rock and moving current. bronze flanks and dark vertical bars distinguish them from largemouth bass." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 1.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 12.0 +sell_value_min = 6 +sell_value_max = 15 +sell_value_curve = 0.9 diff --git a/fish/species/smelt_eulachon/smelt_eulachon.tres b/fish/species/smelt_eulachon/smelt_eulachon.tres new file mode 100644 index 0000000..b6d7b16 --- /dev/null +++ b/fish/species/smelt_eulachon/smelt_eulachon.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"smelt_eulachon" +display_name = "eulachon" +active = false +catalog_number = 4201 +collection_group = &"Ocean-run forage fish" +logbook_fact = "eulachon return from the pacific to spawn in coastal rivers. their oil-rich bodies once served as candles when dried and fitted with wicks." +allowed_water_types = 3 +rarity = 1 +base_catch_weight = 0.9 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.5 +sell_value_min = 4 +sell_value_max = 9 +sell_value_curve = 0.98 diff --git a/fish/species/smelt_rainbow/smelt_rainbow.tres b/fish/species/smelt_rainbow/smelt_rainbow.tres new file mode 100644 index 0000000..19f1b1d --- /dev/null +++ b/fish/species/smelt_rainbow/smelt_rainbow.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"smelt_rainbow" +display_name = "rainbow smelt" +active = false +catalog_number = 4101 +collection_group = &"Migratory forage fish" +logbook_fact = "rainbow smelt move between coastal water and rivers, though some remain landlocked. cucumber-like aromas cling to freshly caught fish." +allowed_water_types = 3 +rarity = 0 +base_catch_weight = 2.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.8 +sell_value_min = 2 +sell_value_max = 5 +sell_value_curve = 1.0 diff --git a/fish/species/snakehead_giant/snakehead_giant.tres b/fish/species/snakehead_giant/snakehead_giant.tres new file mode 100644 index 0000000..44b10e3 --- /dev/null +++ b/fish/species/snakehead_giant/snakehead_giant.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"snakehead_giant" +display_name = "giant snakehead" +active = false +catalog_number = 7601 +collection_group = &"Tropical freshwater predators" +logbook_fact = "giant snakeheads breathe air and guard schools of young near the surface. long bodies launch sudden attacks from flooded vegetation." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 3.0 +weight_max_lb = 45.0 +sell_value_min = 28 +sell_value_max = 64 +sell_value_curve = 0.84 diff --git a/fish/species/snapper_lane/snapper_lane.tres b/fish/species/snapper_lane/snapper_lane.tres index e9e7422..f72ab38 100644 --- a/fish/species/snapper_lane/snapper_lane.tres +++ b/fish/species/snapper_lane/snapper_lane.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"snapper_lane" display_name = "lane snapper" +active = true +catalog_number = 6001 +collection_group = &"Reef snapper" +logbook_fact = "lane snapper use reef structure for cover and hunt small crustaceans and fish when the light begins to fade." allowed_water_types = 2 base_catch_weight = 0.45 catch_profile = ExtResource("2_profile") diff --git a/fish/species/snapper_mangrove/snapper_mangrove.tres b/fish/species/snapper_mangrove/snapper_mangrove.tres index 58226ad..f400800 100644 --- a/fish/species/snapper_mangrove/snapper_mangrove.tres +++ b/fish/species/snapper_mangrove/snapper_mangrove.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"snapper_mangrove" display_name = "mangrove snapper" +active = true +catalog_number = 6002 +collection_group = &"Reef snapper" +logbook_fact = "mangrove snapper shelter among roots and docks when young, then move toward reefs as they grow." allowed_water_types = 2 rarity = 1 base_catch_weight = 0.35 diff --git a/fish/species/snapper_mutton/snapper_mutton.tres b/fish/species/snapper_mutton/snapper_mutton.tres index 6d4441a..37b4b24 100644 --- a/fish/species/snapper_mutton/snapper_mutton.tres +++ b/fish/species/snapper_mutton/snapper_mutton.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"snapper_mutton" display_name = "mutton snapper" +active = true +catalog_number = 6003 +collection_group = &"Reef snapper" +logbook_fact = "mutton snapper have canine teeth that help them pick crabs, shrimp, and other hard-shelled prey from the reef." allowed_water_types = 2 rarity = 2 base_catch_weight = 0.2 diff --git a/fish/species/snapper_red/snapper_red.tres b/fish/species/snapper_red/snapper_red.tres index 8778c98..fabf736 100644 --- a/fish/species/snapper_red/snapper_red.tres +++ b/fish/species/snapper_red/snapper_red.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"snapper_red" display_name = "red snapper" +active = true +catalog_number = 6004 +collection_group = &"Reef snapper" +logbook_fact = "red snapper gather around reefs, wrecks, and ledges. their diet includes small fish, shrimp, and squid." allowed_water_types = 2 rarity = 1 base_catch_weight = 0.35 diff --git a/fish/species/snook_common/snook_common.tres b/fish/species/snook_common/snook_common.tres new file mode 100644 index 0000000..e810953 --- /dev/null +++ b/fish/species/snook_common/snook_common.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"snook_common" +display_name = "common snook" +active = false +catalog_number = 7303 +collection_group = &"Tropical estuary" +logbook_fact = "common snook wait around mangrove roots and current seams to ambush prey. a bold black lateral line divides their silver flanks." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 30.0 +sell_value_min = 13 +sell_value_max = 32 +sell_value_curve = 0.85 diff --git a/fish/species/sole_dover/sole_dover.tres b/fish/species/sole_dover/sole_dover.tres new file mode 100644 index 0000000..88daf9a --- /dev/null +++ b/fish/species/sole_dover/sole_dover.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sole_dover" +display_name = "Dover sole" +active = false +catalog_number = 1404 +collection_group = &"Cold shelf fish" +logbook_fact = "dover sole glide over deep muddy bottoms of the eastern pacific. both eyes migrate to the right side as the young fish becomes flat." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 8.0 +sell_value_min = 6 +sell_value_max = 14 +sell_value_curve = 0.9 diff --git a/fish/species/sprat_european/sprat_european.tres b/fish/species/sprat_european/sprat_european.tres new file mode 100644 index 0000000..20f313c --- /dev/null +++ b/fish/species/sprat_european/sprat_european.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"sprat_european" +display_name = "European sprat" +active = false +catalog_number = 1303 +collection_group = &"Cold schooling fish" +logbook_fact = "european sprat form compact schools in northern coastal seas. these tiny herring relatives feed on plankton near the surface." +allowed_water_types = 2 +rarity = 0 +base_catch_weight = 3.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.03 +weight_max_lb = 0.3 +sell_value_min = 1 +sell_value_max = 3 +sell_value_curve = 1.0 diff --git a/fish/species/squid_bigfin_reef/squid_bigfin_reef.tres b/fish/species/squid_bigfin_reef/squid_bigfin_reef.tres new file mode 100644 index 0000000..838a6ef --- /dev/null +++ b/fish/species/squid_bigfin_reef/squid_bigfin_reef.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"squid_bigfin_reef" +display_name = "bigfin reef squid" +active = false +catalog_number = 6501 +collection_group = &"Squid" +logbook_fact = "bigfin reef squid hover in coordinated groups around warm reefs. shifting colors and body patterns signal to nearby squid." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 5.0 +sell_value_min = 13 +sell_value_max = 30 +sell_value_curve = 0.91 diff --git a/fish/species/squid_colossal/squid_colossal.tres b/fish/species/squid_colossal/squid_colossal.tres new file mode 100644 index 0000000..8ade0a5 --- /dev/null +++ b/fish/species/squid_colossal/squid_colossal.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"squid_colossal" +display_name = "colossal squid" +active = false +catalog_number = 6502 +collection_group = &"Squid" +logbook_fact = "colossal squid carry swiveling hooks on their arms and tentacles. enormous eyes gather faint light in the deep southern ocean." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.015 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 400.0 +weight_max_lb = 1100.0 +sell_value_min = 82 +sell_value_max = 190 +sell_value_curve = 0.76 diff --git a/fish/species/squid_giant/squid_giant.tres b/fish/species/squid_giant/squid_giant.tres new file mode 100644 index 0000000..e67af33 --- /dev/null +++ b/fish/species/squid_giant/squid_giant.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"squid_giant" +display_name = "giant squid" +active = false +catalog_number = 6503 +collection_group = &"Squid" +logbook_fact = "giant squid hunt deep ocean prey with two long feeding tentacles. the largest eyes in the animal world watch for movement in darkness." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.02 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 100.0 +weight_max_lb = 600.0 +sell_value_min = 70 +sell_value_max = 165 +sell_value_curve = 0.77 diff --git a/fish/species/squid_humboldt/squid_humboldt.tres b/fish/species/squid_humboldt/squid_humboldt.tres new file mode 100644 index 0000000..038bcf8 --- /dev/null +++ b/fish/species/squid_humboldt/squid_humboldt.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"squid_humboldt" +display_name = "Humboldt squid" +active = false +catalog_number = 6504 +collection_group = &"Squid" +logbook_fact = "humboldt squid flash red and white while hunting in large groups. powerful beaks and grasping suckers handle fish and other squid." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.09 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 5.0 +weight_max_lb = 110.0 +sell_value_min = 26 +sell_value_max = 64 +sell_value_curve = 0.82 diff --git a/fish/species/stingray_ocellate_river/stingray_ocellate_river.tres b/fish/species/stingray_ocellate_river/stingray_ocellate_river.tres new file mode 100644 index 0000000..5ee7b41 --- /dev/null +++ b/fish/species/stingray_ocellate_river/stingray_ocellate_river.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"stingray_ocellate_river" +display_name = "ocellate river stingray" +active = false +catalog_number = 5104 +collection_group = &"Rays and skates" +logbook_fact = "ocellate river stingrays carry bright eye-like spots across a round disc. they hide beneath sand in south american rivers." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.09 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 35.0 +sell_value_min = 28 +sell_value_max = 65 +sell_value_curve = 0.82 diff --git a/fish/species/stingray_southern/stingray_southern.tres b/fish/species/stingray_southern/stingray_southern.tres new file mode 100644 index 0000000..ed24d11 --- /dev/null +++ b/fish/species/stingray_southern/stingray_southern.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"stingray_southern" +display_name = "southern stingray" +active = false +catalog_number = 5105 +collection_group = &"Rays and skates" +logbook_fact = "southern stingrays bury in warm sand with only their eyes and spiracles visible. crushing plates break open clams and crustaceans." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.23 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 80.0 +sell_value_min = 15 +sell_value_max = 40 +sell_value_curve = 0.82 diff --git a/fish/species/sturgeon_lake/sturgeon_lake.tres b/fish/species/sturgeon_lake/sturgeon_lake.tres new file mode 100644 index 0000000..b69a743 --- /dev/null +++ b/fish/species/sturgeon_lake/sturgeon_lake.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sturgeon_lake" +display_name = "lake sturgeon" +active = false +catalog_number = 102 +collection_group = &"Ancient freshwater fish" +logbook_fact = "lake sturgeon sweep the bottom with four sensitive barbels before extending a tube-like mouth to feed. they can live for decades." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.09 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 10.0 +weight_max_lb = 180.0 +sell_value_min = 36 +sell_value_max = 82 +sell_value_curve = 0.8 diff --git a/fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres b/fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres new file mode 100644 index 0000000..f62d908 --- /dev/null +++ b/fish/species/sturgeon_shovelnose/sturgeon_shovelnose.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sturgeon_shovelnose" +display_name = "shovelnose sturgeon" +active = false +catalog_number = 105 +collection_group = &"Ancient freshwater fish" +logbook_fact = "shovelnose sturgeon hug flowing river bottoms and probe for insect larvae. a flattened snout helps them hold position in strong current." +allowed_water_types = 1 +rarity = 2 +base_catch_weight = 0.22 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 8.0 +sell_value_min = 12 +sell_value_max = 25 +sell_value_curve = 0.9 diff --git a/fish/species/sturgeon_white/sturgeon_white.tres b/fish/species/sturgeon_white/sturgeon_white.tres new file mode 100644 index 0000000..9b4892c --- /dev/null +++ b/fish/species/sturgeon_white/sturgeon_white.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"sturgeon_white" +display_name = "white sturgeon" +active = false +catalog_number = 4301 +collection_group = &"Ocean-run giants" +logbook_fact = "white sturgeon are the largest freshwater fish in north america. armored plates line bodies built for long lives in rivers and estuaries." +allowed_water_types = 3 +rarity = 4 +base_catch_weight = 0.045 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 20.0 +weight_max_lb = 500.0 +sell_value_min = 58 +sell_value_max = 135 +sell_value_curve = 0.78 diff --git a/fish/species/sucker_white/sucker_white.tres b/fish/species/sucker_white/sucker_white.tres new file mode 100644 index 0000000..1e2c2b3 --- /dev/null +++ b/fish/species/sucker_white/sucker_white.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"sucker_white" +display_name = "white sucker" +active = false +catalog_number = 2305 +collection_group = &"Freshwater bottom fish" +logbook_fact = "white suckers vacuum insects and organic matter from cool freshwater bottoms. spring runs carry large groups into shallow streams." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.0 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 8.0 +sell_value_min = 3 +sell_value_max = 8 +sell_value_curve = 0.9 diff --git a/fish/species/sunfish/sunfish.tres b/fish/species/sunfish/sunfish.tres index 14d2ced..9b9401d 100644 --- a/fish/species/sunfish/sunfish.tres +++ b/fish/species/sunfish/sunfish.tres @@ -9,6 +9,10 @@ script = ExtResource("1_fish_data") id = &"sunfish" display_name = "sunfish" +active = true +catalog_number = 5001 +collection_group = &"Open-ocean giants" +logbook_fact = "ocean sunfish are built more like enormous swimming heads than ordinary fish. they visit the surface and turn sideways to warm up." allowed_water_types = 2 rarity = 0 base_catch_weight = 7.0 diff --git a/fish/species/surgeonfish_blue/surgeonfish_blue.tres b/fish/species/surgeonfish_blue/surgeonfish_blue.tres new file mode 100644 index 0000000..9a21da4 --- /dev/null +++ b/fish/species/surgeonfish_blue/surgeonfish_blue.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"surgeonfish_blue" +display_name = "blue tang" +active = false +catalog_number = 5501 +collection_group = &"Reef grazers" +logbook_fact = "blue tangs graze algae from coral reefs with small close-set teeth. sharp folding spines near the tail give surgeonfish their name." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.9 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 1.5 +sell_value_min = 5 +sell_value_max = 11 +sell_value_curve = 0.95 diff --git a/fish/species/swordfish/swordfish.tres b/fish/species/swordfish/swordfish.tres index 2184395..5f776ca 100644 --- a/fish/species/swordfish/swordfish.tres +++ b/fish/species/swordfish/swordfish.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"ocean"]) script = ExtResource("1_fish_data") id = &"swordfish" display_name = "swordfish" +active = true +catalog_number = 4604 +collection_group = &"Oceanic billfish" +logbook_fact = "swordfish are fast, wide-ranging predators with a flattened bill. they can cross deep water and warm surface layers in one day." allowed_water_types = 2 rarity = 4 base_catch_weight = 0.06 diff --git a/fish/species/tambaqui/tambaqui.tres b/fish/species/tambaqui/tambaqui.tres new file mode 100644 index 0000000..981d643 --- /dev/null +++ b/fish/species/tambaqui/tambaqui.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"tambaqui" +display_name = "tambaqui" +active = false +catalog_number = 7509 +collection_group = &"Tropical freshwater fish" +logbook_fact = "tambaqui follow seasonal floods into forests to feed on fruit and seeds. strong square teeth crack tough plant material." +allowed_water_types = 1 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 8.0 +weight_max_lb = 80.0 +sell_value_min = 30 +sell_value_max = 68 +sell_value_curve = 0.82 diff --git a/fish/species/tang_yellow/tang_yellow.tres b/fish/species/tang_yellow/tang_yellow.tres new file mode 100644 index 0000000..c4facd7 --- /dev/null +++ b/fish/species/tang_yellow/tang_yellow.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"tang_yellow" +display_name = "yellow tang" +active = false +catalog_number = 5504 +collection_group = &"Reef grazers" +logbook_fact = "yellow tangs browse algae across hawaiian reefs during daylight. at night their bright bodies darken and show a pale horizontal stripe." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.35 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 0.8 +sell_value_min = 9 +sell_value_max = 20 +sell_value_curve = 0.96 diff --git a/fish/species/tarpon_atlantic/tarpon_atlantic.tres b/fish/species/tarpon_atlantic/tarpon_atlantic.tres new file mode 100644 index 0000000..c2fbff0 --- /dev/null +++ b/fish/species/tarpon_atlantic/tarpon_atlantic.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"tarpon_atlantic" +display_name = "atlantic tarpon" +active = false +catalog_number = 7301 +collection_group = &"Tropical estuary" +logbook_fact = "atlantic tarpon gulp air with a lung-like swim bladder when coastal water runs low on oxygen. giant silver scales flash during leaps." +allowed_water_types = 3 +rarity = 3 +base_catch_weight = 0.09 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 10.0 +weight_max_lb = 180.0 +sell_value_min = 34 +sell_value_max = 82 +sell_value_curve = 0.8 diff --git a/fish/species/tautog/tautog.tres b/fish/species/tautog/tautog.tres new file mode 100644 index 0000000..cbd926f --- /dev/null +++ b/fish/species/tautog/tautog.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"tautog" +display_name = "tautog" +active = false +catalog_number = 6906 +collection_group = &"Temperate reef fish" +logbook_fact = "tautog pry mussels and crabs from rocky structure with thick lips and strong teeth. adults return to familiar shelters year after year." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 20.0 +sell_value_min = 7 +sell_value_max = 18 +sell_value_curve = 0.86 diff --git a/fish/species/tench/tench.tres b/fish/species/tench/tench.tres new file mode 100644 index 0000000..300a922 --- /dev/null +++ b/fish/species/tench/tench.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"tench" +display_name = "tench" +active = false +catalog_number = 2509 +collection_group = &"Freshwater coarse fish" +logbook_fact = "tench browse quiet, muddy bottoms with two small mouth barbels. a thick coat of slime protects their olive-green scales." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.75 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 12.0 +sell_value_min = 7 +sell_value_max = 17 +sell_value_curve = 0.88 diff --git a/fish/species/tetra_neon/tetra_neon.tres b/fish/species/tetra_neon/tetra_neon.tres new file mode 100644 index 0000000..487ef9b --- /dev/null +++ b/fish/species/tetra_neon/tetra_neon.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"tetra_neon" +display_name = "neon tetra" +active = false +catalog_number = 2102 +collection_group = &"Freshwater aquarium fish" +logbook_fact = "neon tetras school through shaded forest streams. an iridescent blue stripe remains visible in the dim, tannin-stained water." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.9 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.01 +weight_max_lb = 0.08 +sell_value_min = 4 +sell_value_max = 8 +sell_value_curve = 0.98 diff --git a/fish/species/tigerfish_goliath/tigerfish_goliath.tres b/fish/species/tigerfish_goliath/tigerfish_goliath.tres new file mode 100644 index 0000000..dec9d49 --- /dev/null +++ b/fish/species/tigerfish_goliath/tigerfish_goliath.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"tigerfish_goliath" +display_name = "goliath tigerfish" +active = false +catalog_number = 2703 +collection_group = &"Freshwater giants" +logbook_fact = "goliath tigerfish patrol powerful african rivers with interlocking dagger-like teeth. a muscular forked tail drives sudden attacks." +allowed_water_types = 1 +rarity = 4 +base_catch_weight = 0.035 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 20.0 +weight_max_lb = 150.0 +sell_value_min = 58 +sell_value_max = 132 +sell_value_curve = 0.8 diff --git a/fish/species/tilapia_nile/tilapia_nile.tres b/fish/species/tilapia_nile/tilapia_nile.tres new file mode 100644 index 0000000..3db4fb6 --- /dev/null +++ b/fish/species/tilapia_nile/tilapia_nile.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"tilapia_nile" +display_name = "Nile tilapia" +active = false +catalog_number = 7506 +collection_group = &"Tropical freshwater fish" +logbook_fact = "nile tilapia thrive in warm lakes and rivers on a varied diet. females protect eggs and young inside their mouths." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 8.0 +sell_value_min = 3 +sell_value_max = 9 +sell_value_curve = 0.9 diff --git a/fish/species/tilefish_blueline/tilefish_blueline.tres b/fish/species/tilefish_blueline/tilefish_blueline.tres new file mode 100644 index 0000000..53598bd --- /dev/null +++ b/fish/species/tilefish_blueline/tilefish_blueline.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"tilefish_blueline" +display_name = "blueline tilefish" +active = false +catalog_number = 1601 +collection_group = &"Deep shelf fish" +logbook_fact = "blueline tilefish shelter in burrows and rocky openings along deep shelves. a narrow blue stripe traces the edge of the dorsal fin." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.7 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 20.0 +sell_value_min = 7 +sell_value_max = 18 +sell_value_curve = 0.86 diff --git a/fish/species/tilefish_golden/tilefish_golden.tres b/fish/species/tilefish_golden/tilefish_golden.tres new file mode 100644 index 0000000..26e9543 --- /dev/null +++ b/fish/species/tilefish_golden/tilefish_golden.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"tilefish_golden" +display_name = "golden tilefish" +active = false +catalog_number = 1602 +collection_group = &"Deep shelf fish" +logbook_fact = "golden tilefish excavate burrows in soft clay along deep ocean slopes. their bright yellow spots contrast with blue-green backs." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.22 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 50.0 +sell_value_min = 15 +sell_value_max = 37 +sell_value_curve = 0.84 diff --git a/fish/species/trevally_bluefin/trevally_bluefin.tres b/fish/species/trevally_bluefin/trevally_bluefin.tres new file mode 100644 index 0000000..9c06970 --- /dev/null +++ b/fish/species/trevally_bluefin/trevally_bluefin.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"trevally_bluefin" +display_name = "bluefin trevally" +active = false +catalog_number = 5802 +collection_group = &"Reef predators" +logbook_fact = "bluefin trevally hunt reef fish in coordinated groups. electric blue fins and scattered blue spots contrast with a golden body." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 25.0 +sell_value_min = 14 +sell_value_max = 32 +sell_value_curve = 0.86 diff --git a/fish/species/trevally_giant/trevally_giant.tres b/fish/species/trevally_giant/trevally_giant.tres new file mode 100644 index 0000000..f1acce2 --- /dev/null +++ b/fish/species/trevally_giant/trevally_giant.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"trevally_giant" +display_name = "giant trevally" +active = false +catalog_number = 3603 +collection_group = &"Large coastal predators" +logbook_fact = "giant trevally hunt reef edges with bursts of speed and force. large individuals sometimes charge prey from surf and shallow lagoons." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 10.0 +weight_max_lb = 150.0 +sell_value_min = 32 +sell_value_max = 78 +sell_value_curve = 0.8 diff --git a/fish/species/triggerfish_gray/triggerfish_gray.tres b/fish/species/triggerfish_gray/triggerfish_gray.tres new file mode 100644 index 0000000..9eb4a35 --- /dev/null +++ b/fish/species/triggerfish_gray/triggerfish_gray.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"triggerfish_gray" +display_name = "gray triggerfish" +active = false +catalog_number = 5602 +collection_group = &"Reef oddities" +logbook_fact = "gray triggerfish lock a stout dorsal spine upright when wedged into shelter. strong teeth crack barnacles, crabs, and shellfish." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.3 +weight_max_lb = 12.0 +sell_value_min = 7 +sell_value_max = 17 +sell_value_curve = 0.88 diff --git a/fish/species/triggerfish_queen/triggerfish_queen.tres b/fish/species/triggerfish_queen/triggerfish_queen.tres new file mode 100644 index 0000000..e2de868 --- /dev/null +++ b/fish/species/triggerfish_queen/triggerfish_queen.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"triggerfish_queen" +display_name = "queen triggerfish" +active = false +catalog_number = 5605 +collection_group = &"Reef oddities" +logbook_fact = "queen triggerfish blow jets of water to uncover buried prey and flip sea urchins. vivid blue lines radiate across the face." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 15.0 +sell_value_min = 14 +sell_value_max = 32 +sell_value_curve = 0.88 diff --git a/fish/species/tripletail/tripletail.tres b/fish/species/tripletail/tripletail.tres new file mode 100644 index 0000000..e973888 --- /dev/null +++ b/fish/species/tripletail/tripletail.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"tripletail" +display_name = "tripletail" +active = false +catalog_number = 604 +collection_group = &"Coastal oddities" +logbook_fact = "tripletail often drift sideways near floating debris, resembling a loose leaf. rounded rear fins create the three-tailed silhouette." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.28 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 30.0 +sell_value_min = 13 +sell_value_max = 31 +sell_value_curve = 0.85 diff --git a/fish/species/trout_brown/trout_brown.tres b/fish/species/trout_brown/trout_brown.tres new file mode 100644 index 0000000..0e6cefd --- /dev/null +++ b/fish/species/trout_brown/trout_brown.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false + +[resource] +script = ExtResource("1_fish_data") +id = &"trout_brown" +display_name = "brown trout" +active = false +catalog_number = 1103 +collection_group = &"Cold freshwater salmonids" +logbook_fact = "brown trout often shelter by day and hunt more freely after dark. adaptable populations occupy streams, lakes, and even coastal water." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 25.0 +sell_value_min = 7 +sell_value_max = 20 +sell_value_curve = 0.86 diff --git a/fish/species/trout_cutthroat/trout_cutthroat.tres b/fish/species/trout_cutthroat/trout_cutthroat.tres index fa29c47..61dc080 100644 --- a/fish/species/trout_cutthroat/trout_cutthroat.tres +++ b/fish/species/trout_cutthroat/trout_cutthroat.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"trout_cutthroat" display_name = "cutthroat trout" +active = true +catalog_number = 1104 +collection_group = &"Cold freshwater salmonids" +logbook_fact = "cutthroat trout take their name from the red slash beneath the jaw. many populations rely on cold, well-oxygenated streams." allowed_water_types = 1 rarity = 1 base_catch_weight = 0.4 diff --git a/fish/species/trout_golden/trout_golden.tres b/fish/species/trout_golden/trout_golden.tres index 8aa3201..5c3d87e 100644 --- a/fish/species/trout_golden/trout_golden.tres +++ b/fish/species/trout_golden/trout_golden.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"trout_golden" display_name = "golden trout" +active = true +catalog_number = 1105 +collection_group = &"Cold freshwater salmonids" +logbook_fact = "golden trout evolved in clear, high-elevation california streams. their bright flanks stand out against rocky alpine water." allowed_water_types = 1 rarity = 2 base_catch_weight = 0.2 diff --git a/fish/species/trout_rainbow/trout_rainbow.tres b/fish/species/trout_rainbow/trout_rainbow.tres index f9c74f6..fbcdb42 100644 --- a/fish/species/trout_rainbow/trout_rainbow.tres +++ b/fish/species/trout_rainbow/trout_rainbow.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"trout_rainbow" display_name = "rainbow trout" +active = true +catalog_number = 1106 +collection_group = &"Cold freshwater salmonids" +logbook_fact = "rainbow trout are adaptable stream hunters. the pink lateral stripe is especially vivid when the fish is in breeding condition." allowed_water_types = 1 rarity = 1 base_catch_weight = 0.45 diff --git a/fish/species/trout_steelhead/trout_steelhead.tres b/fish/species/trout_steelhead/trout_steelhead.tres index 57887f7..92f6985 100644 --- a/fish/species/trout_steelhead/trout_steelhead.tres +++ b/fish/species/trout_steelhead/trout_steelhead.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"trout_steelhead" display_name = "steelhead trout" +active = true +catalog_number = 4501 +collection_group = &"Ocean-run salmonids" +logbook_fact = "steelhead are the ocean-going form of rainbow trout. adults can leave fresh water and later return to spawn." allowed_water_types = 1 rarity = 2 base_catch_weight = 0.2 diff --git a/fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres b/fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres new file mode 100644 index 0000000..0a99228 --- /dev/null +++ b/fish/species/trumpetfish_atlantic/trumpetfish_atlantic.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"trumpetfish_atlantic" +display_name = "atlantic trumpetfish" +active = false +catalog_number = 5601 +collection_group = &"Reef oddities" +logbook_fact = "atlantic trumpetfish hover head-down among corals and sea fans. long tubular snouts expand suddenly to draw in small fish." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.3 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.1 +weight_max_lb = 2.0 +sell_value_min = 10 +sell_value_max = 24 +sell_value_curve = 0.94 diff --git a/fish/species/tuna_albacore/tuna_albacore.tres b/fish/species/tuna_albacore/tuna_albacore.tres index 21a9155..d0b841b 100644 --- a/fish/species/tuna_albacore/tuna_albacore.tres +++ b/fish/species/tuna_albacore/tuna_albacore.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"tuna_albacore" display_name = "albacore tuna" +active = true +catalog_number = 4801 +collection_group = &"Oceanic tuna" +logbook_fact = "albacore have unusually long pectoral fins. their warm muscles help them cruise across wide stretches of open ocean." allowed_water_types = 2 rarity = 2 base_catch_weight = 1.5 diff --git a/fish/species/tuna_bigeye/tuna_bigeye.tres b/fish/species/tuna_bigeye/tuna_bigeye.tres index e5e4b7c..8c6c867 100644 --- a/fish/species/tuna_bigeye/tuna_bigeye.tres +++ b/fish/species/tuna_bigeye/tuna_bigeye.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"tuna_bigeye" display_name = "bigeye tuna" +active = true +catalog_number = 4802 +collection_group = &"Oceanic tuna" +logbook_fact = "bigeye tuna make daily trips between deep, cool water and warmer surface layers. their large eyes suit those dim depths." allowed_water_types = 2 rarity = 3 base_catch_weight = 0.55 diff --git a/fish/species/tuna_bluefin/tuna_bluefin.tres b/fish/species/tuna_bluefin/tuna_bluefin.tres index a669b5d..13e8bc2 100644 --- a/fish/species/tuna_bluefin/tuna_bluefin.tres +++ b/fish/species/tuna_bluefin/tuna_bluefin.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"tuna_bluefin" display_name = "bluefin tuna" +active = true +catalog_number = 4803 +collection_group = &"Oceanic tuna" +logbook_fact = "bluefin tuna are powerful ocean travelers. heat retained in their swimming muscles lets them thrive in surprisingly cold seas." allowed_water_types = 2 rarity = 4 base_catch_weight = 0.18 diff --git a/fish/species/tuna_skipjack/tuna_skipjack.tres b/fish/species/tuna_skipjack/tuna_skipjack.tres index 4d9e5a8..4541393 100644 --- a/fish/species/tuna_skipjack/tuna_skipjack.tres +++ b/fish/species/tuna_skipjack/tuna_skipjack.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"tuna_skipjack" display_name = "skipjack tuna" +active = true +catalog_number = 4804 +collection_group = &"Oceanic tuna" +logbook_fact = "skipjack travel in fast-moving schools and have dark stripes along their lower sides. they rarely stop swimming." allowed_water_types = 2 rarity = 1 base_catch_weight = 3.0 diff --git a/fish/species/tuna_yellowfin/tuna_yellowfin.tres b/fish/species/tuna_yellowfin/tuna_yellowfin.tres index cbd4950..5c5acc3 100644 --- a/fish/species/tuna_yellowfin/tuna_yellowfin.tres +++ b/fish/species/tuna_yellowfin/tuna_yellowfin.tres @@ -14,6 +14,10 @@ preferred_bait_weight_multiplier = 1.4 script = ExtResource("1_fish_data") id = &"tuna_yellowfin" display_name = "yellowfin tuna" +active = true +catalog_number = 4805 +collection_group = &"Oceanic tuna" +logbook_fact = "yellowfin are named for their bright yellow fins and finlets. large schools often gather with other open-ocean hunters." allowed_water_types = 2 rarity = 2 catch_profile = ExtResource("2_profile") diff --git a/fish/species/turbot/turbot.tres b/fish/species/turbot/turbot.tres new file mode 100644 index 0000000..6b46871 --- /dev/null +++ b/fish/species/turbot/turbot.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"turbot" +display_name = "turbot" +active = false +catalog_number = 3703 +collection_group = &"Large flatfish" +logbook_fact = "turbot have broad, nearly circular bodies covered with bony bumps instead of scales. they bury into sand before ambushing fish and crustaceans." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.24 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 1.0 +weight_max_lb = 35.0 +sell_value_min = 14 +sell_value_max = 34 +sell_value_curve = 0.85 diff --git a/fish/species/turtle_green/turtle_green.tres b/fish/species/turtle_green/turtle_green.tres new file mode 100644 index 0000000..91f40cd --- /dev/null +++ b/fish/species/turtle_green/turtle_green.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"turtle_green" +display_name = "green sea turtle" +active = false +catalog_number = 6201 +collection_group = &"Sea turtles" +logbook_fact = "green sea turtles graze seagrass meadows with finely serrated jaws. adults migrate long distances between feeding and nesting grounds." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.018 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 65.0 +weight_max_lb = 500.0 +sell_value_min = 62 +sell_value_max = 145 +sell_value_curve = 0.78 diff --git a/fish/species/turtle_hawksbill/turtle_hawksbill.tres b/fish/species/turtle_hawksbill/turtle_hawksbill.tres new file mode 100644 index 0000000..5e07f77 --- /dev/null +++ b/fish/species/turtle_hawksbill/turtle_hawksbill.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"turtle_hawksbill" +display_name = "hawksbill sea turtle" +active = false +catalog_number = 6202 +collection_group = &"Sea turtles" +logbook_fact = "hawksbill sea turtles reach into reef crevices with narrow hooked beaks. a diet rich in sponges helps shape coral communities." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.014 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 75.0 +weight_max_lb = 250.0 +sell_value_min = 66 +sell_value_max = 150 +sell_value_curve = 0.8 diff --git a/fish/species/turtle_leatherback/turtle_leatherback.tres b/fish/species/turtle_leatherback/turtle_leatherback.tres new file mode 100644 index 0000000..1e89bee --- /dev/null +++ b/fish/species/turtle_leatherback/turtle_leatherback.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"turtle_leatherback" +display_name = "leatherback sea turtle" +active = false +catalog_number = 6203 +collection_group = &"Sea turtles" +logbook_fact = "leatherback sea turtles cross entire oceans while hunting jellies. a flexible ridged shell and internal heat help them enter cold water." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.012 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 500.0 +weight_max_lb = 2000.0 +sell_value_min = 75 +sell_value_max = 175 +sell_value_curve = 0.76 diff --git a/fish/species/turtle_loggerhead/turtle_loggerhead.tres b/fish/species/turtle_loggerhead/turtle_loggerhead.tres new file mode 100644 index 0000000..5b64995 --- /dev/null +++ b/fish/species/turtle_loggerhead/turtle_loggerhead.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"turtle_loggerhead" +display_name = "loggerhead sea turtle" +active = false +catalog_number = 6204 +collection_group = &"Sea turtles" +logbook_fact = "loggerhead sea turtles crush crabs and mollusks with massive jaws. females often return near their birth beaches to nest." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.016 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 150.0 +weight_max_lb = 1200.0 +sell_value_min = 68 +sell_value_max = 155 +sell_value_curve = 0.77 diff --git a/fish/species/urchin_purple/urchin_purple.tres b/fish/species/urchin_purple/urchin_purple.tres new file mode 100644 index 0000000..7725d3d --- /dev/null +++ b/fish/species/urchin_purple/urchin_purple.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"urchin_purple" +display_name = "purple sea urchin" +active = false +catalog_number = 1903 +collection_group = &"Echinoderms" +logbook_fact = "purple sea urchins scrape algae from rocks with a five-toothed feeding structure. dense groups can clear kelp from entire reefs." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.75 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.05 +weight_max_lb = 1.0 +sell_value_min = 5 +sell_value_max = 12 +sell_value_curve = 0.96 diff --git a/fish/species/wahoo/wahoo.tres b/fish/species/wahoo/wahoo.tres new file mode 100644 index 0000000..4753b9d --- /dev/null +++ b/fish/species/wahoo/wahoo.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"wahoo" +display_name = "wahoo" +active = false +catalog_number = 4703 +collection_group = &"Oceanic pelagic fish" +logbook_fact = "wahoo are streamlined open-ocean hunters with rows of sharp teeth. blue vertical bars flicker across their sides during fast pursuits." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.11 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 10.0 +weight_max_lb = 100.0 +sell_value_min = 30 +sell_value_max = 70 +sell_value_curve = 0.82 diff --git a/fish/species/walleye/walleye.tres b/fish/species/walleye/walleye.tres index ce833c9..97dea01 100644 --- a/fish/species/walleye/walleye.tres +++ b/fish/species/walleye/walleye.tres @@ -13,6 +13,10 @@ allowed_location_tags = Array[StringName]([&"starter_pond"]) script = ExtResource("1_fish_data") id = &"walleye" display_name = "walleye" +active = true +catalog_number = 3306 +collection_group = &"Freshwater predators" +logbook_fact = "walleye have light-sensitive eyes that help them hunt in murky water and around dusk. their reflective layer gives the eyes a pale glow." allowed_water_types = 1 rarity = 1 base_catch_weight = 0.4 diff --git a/fish/species/walrus/walrus.tres b/fish/species/walrus/walrus.tres new file mode 100644 index 0000000..41682d5 --- /dev/null +++ b/fish/species/walrus/walrus.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"walrus" +display_name = "walrus" +active = false +catalog_number = 504 +collection_group = &"Coastal marine mammals" +logbook_fact = "walruses sweep the seafloor for clams and other soft-bodied prey. long tusks help them haul onto ice and settle disputes." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.012 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 800.0 +weight_max_lb = 3700.0 +sell_value_min = 74 +sell_value_max = 170 +sell_value_curve = 0.76 diff --git a/fish/species/warmouth/warmouth.tres b/fish/species/warmouth/warmouth.tres new file mode 100644 index 0000000..af0214f --- /dev/null +++ b/fish/species/warmouth/warmouth.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"warmouth" +display_name = "warmouth" +active = false +catalog_number = 3106 +collection_group = &"Freshwater panfish" +logbook_fact = "warmouth hide in weeds, roots, and murky backwaters before ambushing prey. red eyes and dark cheek stripes frame a notably large mouth." +allowed_water_types = 1 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 2.0 +sell_value_min = 5 +sell_value_max = 10 +sell_value_curve = 0.95 diff --git a/fish/species/weakfish/weakfish.tres b/fish/species/weakfish/weakfish.tres new file mode 100644 index 0000000..b0072e3 --- /dev/null +++ b/fish/species/weakfish/weakfish.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"weakfish" +display_name = "weakfish" +active = false +catalog_number = 6805 +collection_group = &"Temperate estuary" +logbook_fact = "weakfish are named for delicate mouth tissue that tears easily around a hook. iridescent spots scatter across their bronze backs." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.32 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 18.0 +sell_value_min = 12 +sell_value_max = 29 +sell_value_curve = 0.86 diff --git a/fish/species/whale_blue/whale_blue.tres b/fish/species/whale_blue/whale_blue.tres new file mode 100644 index 0000000..9fab3ed --- /dev/null +++ b/fish/species/whale_blue/whale_blue.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"whale_blue" +display_name = "blue whale" +active = false +catalog_number = 7701 +collection_group = &"Whales and dolphins" +logbook_fact = "blue whales are the largest animals known to have lived. pleated throats expand around vast mouthfuls of water that baleen filters for krill." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.005 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 100000.0 +weight_max_lb = 330000.0 +sell_value_min = 120 +sell_value_max = 300 +sell_value_curve = 0.72 diff --git a/fish/species/whale_humpback/whale_humpback.tres b/fish/species/whale_humpback/whale_humpback.tres new file mode 100644 index 0000000..e20e736 --- /dev/null +++ b/fish/species/whale_humpback/whale_humpback.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"whale_humpback" +display_name = "humpback whale" +active = false +catalog_number = 7703 +collection_group = &"Whales and dolphins" +logbook_fact = "humpback whales use long pectoral fins while turning and feeding. males produce layered songs that change across breeding seasons." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.008 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 40000.0 +weight_max_lb = 90000.0 +sell_value_min = 105 +sell_value_max = 260 +sell_value_curve = 0.73 diff --git a/fish/species/whale_killer/whale_killer.tres b/fish/species/whale_killer/whale_killer.tres new file mode 100644 index 0000000..b3ea92a --- /dev/null +++ b/fish/species/whale_killer/whale_killer.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +require_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"whale_killer" +display_name = "killer whale" +active = false +catalog_number = 7704 +collection_group = &"Whales and dolphins" +logbook_fact = "killer whales live in close family groups with distinct calls and hunting traditions. different populations specialize in different prey." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.008 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 3000.0 +weight_max_lb = 12000.0 +sell_value_min = 95 +sell_value_max = 230 +sell_value_curve = 0.74 diff --git a/fish/species/whale_sperm/whale_sperm.tres b/fish/species/whale_sperm/whale_sperm.tres new file mode 100644 index 0000000..a10b923 --- /dev/null +++ b/fish/species/whale_sperm/whale_sperm.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_day = false +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"whale_sperm" +display_name = "sperm whale" +active = false +catalog_number = 7705 +collection_group = &"Whales and dolphins" +logbook_fact = "sperm whales make deep dives to hunt squid with powerful echolocation clicks. their enormous square heads contain a waxy spermaceti organ." +allowed_water_types = 2 +rarity = 4 +base_catch_weight = 0.006 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 15000.0 +weight_max_lb = 125000.0 +sell_value_min = 115 +sell_value_max = 280 +sell_value_curve = 0.72 diff --git a/fish/species/white_perch/white_perch.tres b/fish/species/white_perch/white_perch.tres new file mode 100644 index 0000000..ee06ee4 --- /dev/null +++ b/fish/species/white_perch/white_perch.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"white_perch" +display_name = "white perch" +active = false +catalog_number = 6806 +collection_group = &"Temperate estuary" +logbook_fact = "white perch tolerate fresh and brackish water along the atlantic coast. deep silver bodies gather in schools around river mouths." +allowed_water_types = 3 +rarity = 1 +base_catch_weight = 1.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 3.5 +sell_value_min = 5 +sell_value_max = 11 +sell_value_curve = 0.9 diff --git a/fish/species/whitefish_lake/whitefish_lake.tres b/fish/species/whitefish_lake/whitefish_lake.tres new file mode 100644 index 0000000..4ad0281 --- /dev/null +++ b/fish/species/whitefish_lake/whitefish_lake.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") + +[resource] +script = ExtResource("1_fish_data") +id = &"whitefish_lake" +display_name = "lake whitefish" +active = false +catalog_number = 1003 +collection_group = &"Cold freshwater fish" +logbook_fact = "lake whitefish browse deep, cold bottoms with small downward-pointing mouths. large schools move toward shallows to spawn in autumn." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 1.5 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.5 +weight_max_lb = 12.0 +sell_value_min = 4 +sell_value_max = 11 +sell_value_curve = 0.9 diff --git a/fish/species/wolffish_atlantic/wolffish_atlantic.tres b/fish/species/wolffish_atlantic/wolffish_atlantic.tres new file mode 100644 index 0000000..a305cc7 --- /dev/null +++ b/fish/species/wolffish_atlantic/wolffish_atlantic.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +forbid_rain = true + +[resource] +script = ExtResource("1_fish_data") +id = &"wolffish_atlantic" +display_name = "atlantic wolffish" +active = false +catalog_number = 1201 +collection_group = &"Cold reef fish" +logbook_fact = "atlantic wolffish use heavy jaws and blunt teeth to crush shellfish and urchins. natural antifreeze proteins help them endure icy water." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.25 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 2.0 +weight_max_lb = 40.0 +sell_value_min = 14 +sell_value_max = 34 +sell_value_curve = 0.84 diff --git a/fish/species/wolffish_spotted/wolffish_spotted.tres b/fish/species/wolffish_spotted/wolffish_spotted.tres new file mode 100644 index 0000000..52a1de3 --- /dev/null +++ b/fish/species/wolffish_spotted/wolffish_spotted.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"wolffish_spotted" +display_name = "spotted wolffish" +active = false +catalog_number = 1203 +collection_group = &"Cold reef fish" +logbook_fact = "spotted wolffish crush hard-shelled prey with broad molar-like teeth. their pale spots stand out against a dark cold-water body." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.11 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 3.0 +weight_max_lb = 50.0 +sell_value_min = 26 +sell_value_max = 60 +sell_value_curve = 0.84 diff --git a/fish/species/wrasse_ballan/wrasse_ballan.tres b/fish/species/wrasse_ballan/wrasse_ballan.tres new file mode 100644 index 0000000..63cb0b6 --- /dev/null +++ b/fish/species/wrasse_ballan/wrasse_ballan.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"wrasse_ballan" +display_name = "ballan wrasse" +active = false +catalog_number = 6101 +collection_group = &"Reef wrasses" +logbook_fact = "ballan wrasse crush shellfish and sea urchins with strong throat teeth. thick lips and mottled colors suit rocky european reefs." +allowed_water_types = 2 +rarity = 1 +base_catch_weight = 0.8 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 10.0 +sell_value_min = 6 +sell_value_max = 15 +sell_value_curve = 0.9 diff --git a/fish/species/wrasse_cleaner/wrasse_cleaner.tres b/fish/species/wrasse_cleaner/wrasse_cleaner.tres new file mode 100644 index 0000000..e22c1f0 --- /dev/null +++ b/fish/species/wrasse_cleaner/wrasse_cleaner.tres @@ -0,0 +1,29 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false +forbid_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"wrasse_cleaner" +display_name = "cleaner wrasse" +active = false +catalog_number = 6102 +collection_group = &"Reef wrasses" +logbook_fact = "cleaner wrasses advertise with a bright stripe and dance at reef stations. larger fish wait while parasites are picked from skin and gills." +allowed_water_types = 2 +rarity = 2 +base_catch_weight = 0.35 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.01 +weight_max_lb = 0.2 +sell_value_min = 9 +sell_value_max = 20 +sell_value_curve = 1.0 diff --git a/fish/species/wreckfish/wreckfish.tres b/fish/species/wreckfish/wreckfish.tres new file mode 100644 index 0000000..a2121ef --- /dev/null +++ b/fish/species/wreckfish/wreckfish.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +require_fog = true + +[resource] +script = ExtResource("1_fish_data") +id = &"wreckfish" +display_name = "wreckfish" +active = false +catalog_number = 1606 +collection_group = &"Deep shelf fish" +logbook_fact = "wreckfish gather around caves, ledges, and shipwrecks in deep water. powerful jaws let them ambush fish and large crustaceans." +allowed_water_types = 2 +rarity = 3 +base_catch_weight = 0.1 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 10.0 +weight_max_lb = 180.0 +sell_value_min = 31 +sell_value_max = 76 +sell_value_curve = 0.8 diff --git a/fish/species/yellow_perch/yellow_perch.tres b/fish/species/yellow_perch/yellow_perch.tres new file mode 100644 index 0000000..3147fdd --- /dev/null +++ b/fish/species/yellow_perch/yellow_perch.tres @@ -0,0 +1,28 @@ +[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] + +[ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] +[ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] +[ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] + +[sub_resource type="Resource" id="Availability"] +script = ExtResource("3_availability") +allow_night = false + +[resource] +script = ExtResource("1_fish_data") +id = &"yellow_perch" +display_name = "yellow perch" +active = false +catalog_number = 3201 +collection_group = &"Freshwater perch" +logbook_fact = "yellow perch travel in schools through cool lakes and slow rivers. dark vertical bars and orange lower fins make them easy to recognize." +allowed_water_types = 1 +rarity = 0 +base_catch_weight = 2.2 +catch_profile = ExtResource("2_profile") +availability = SubResource("Availability") +weight_min_lb = 0.2 +weight_max_lb = 4.0 +sell_value_min = 3 +sell_value_max = 8 +sell_value_curve = 0.9 diff --git a/fishing/fishing_spot.gd b/fishing/fishing_spot.gd index 167a08b..2c8f584 100644 --- a/fishing/fishing_spot.gd +++ b/fishing/fishing_spot.gd @@ -15,6 +15,7 @@ const PlayerExperienceType = preload( ) const ItemCatalogType = preload("res://items/item_catalog.gd") const ItemDataType = preload("res://items/item_data.gd") +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const PlayerBagType = preload("res://inventory/player_bag.gd") const PlayerHotbarType = preload("res://inventory/player_hotbar.gd") const PlayerFishingUpgradesType = preload( @@ -658,7 +659,7 @@ func has_active_fishing_rod() -> bool: var item: ItemDataType = _get_active_item() return ( item != null - and item.is_valid() + and item.is_available() and item.category == ItemDataType.Category.ROD and item.usable and item.equippable @@ -676,7 +677,11 @@ func _get_active_item() -> ItemDataType: if item_id.is_empty() or not _local_bag.owns_item(item_id): return null var item: ItemDataType = _item_catalog.get_item_by_id(item_id) - return item if item != null and item.is_valid() else null + return item if item != null and item.is_available() else null + + +func _get_active_rod() -> FishingRodDataType: + return _get_active_item() as FishingRodDataType func _is_cooler_full() -> bool: @@ -829,7 +834,9 @@ func _on_cast_completed() -> void: _selected_water_region = get_fishable_water_region(_cast_target) _selection_context = _build_fishing_context(_selected_water_region) + var active_rod: FishingRodDataType = _get_active_rod() _fish_selector.undiscovered_weight_multiplier = undiscovered_weight_multiplier + _fish_selector.active_rod = active_rod _fish_selector.rarity_weight_multipliers = [] for rarity: int in range(FishDataType.Rarity.size()): _fish_selector.rarity_weight_multipliers.append( @@ -856,6 +863,10 @@ func _on_cast_completed() -> void: _item_effects.get_bite_time_multiplier() if _item_effects != null else 1.0 + ) * ( + active_rod.bite_time_multiplier + if active_rod != null + else 1.0 ) _withdrawal_progress = 0.0 _withdrawal_input_held = false @@ -1055,6 +1066,7 @@ func _activate_bite(confirmation_override: bool = false) -> void: func _get_effective_reel_speed() -> float: if _active_player == null: return 0.0 + var rod: FishingRodDataType = _get_active_rod() return _active_player.reel_speed * ( _fishing_upgrades.get_reel_speed_multiplier() if _fishing_upgrades != null @@ -1063,13 +1075,16 @@ func _get_effective_reel_speed() -> float: _item_effects.get_reel_multiplier() if _item_effects != null else 1.0 + ) * ( + rod.reel_speed_multiplier if rod != null else 1.0 ) func _get_effective_barrier_damage() -> int: if _active_player == null: return 1 - return ( + var rod: FishingRodDataType = _get_active_rod() + var damage: int = ( _fishing_upgrades.get_barrier_damage() if _fishing_upgrades != null else _active_player.click_power @@ -1078,6 +1093,13 @@ func _get_effective_barrier_damage() -> int: if _item_effects != null else 0 ) + return maxi( + roundi( + float(damage) + * (rod.barrier_power_multiplier if rod != null else 1.0) + ), + 1, + ) func _on_catch_encounter_updated( @@ -1512,7 +1534,11 @@ func _get_active_bait_tags() -> Array[StringName]: if bait_id.is_empty() or _local_bag == null or not _local_bag.owns_item(bait_id): return [] var item: ItemDataType = _item_catalog.get_item_by_id(bait_id) - return item.bait_tags.duplicate() if item != null and item.is_bait() else [] + return ( + item.bait_tags.duplicate() + if item != null and item.is_available() and item.is_bait() + else [] + ) func _active_lure_has_effect(effect_id: StringName) -> bool: @@ -1527,7 +1553,12 @@ func _active_lure_has_effect(effect_id: StringName) -> bool: var lure: ItemDataType = _item_catalog.get_item_by_id( _local_player.active_lure_id ) - return lure != null and lure.is_lure() and effect_id in lure.lure_effects + return ( + lure != null + and lure.is_available() + and lure.is_lure() + and effect_id in lure.lure_effects + ) func _build_network_evidence() -> Dictionary: diff --git a/inventory/player_bag.gd b/inventory/player_bag.gd index 4fc12b6..ffb734d 100644 --- a/inventory/player_bag.gd +++ b/inventory/player_bag.gd @@ -39,7 +39,7 @@ func add_item(item_id: StringName, quantity: int = 1) -> bool: func can_add_item(item_id: StringName, quantity: int = 1) -> bool: - var item: ItemDataType = _resolve_valid_item(item_id) + var item: ItemDataType = _resolve_available_item(item_id) if item == null or quantity <= 0: return false var existing: OwnedItemType = get_owned_item(item_id) @@ -156,3 +156,8 @@ func _resolve_valid_item(item_id: StringName) -> ItemDataType: return null var item: ItemDataType = _catalog.get_item_by_id(item_id) return item if item != null and item.is_valid() else null + + +func _resolve_available_item(item_id: StringName) -> ItemDataType: + var item: ItemDataType = _resolve_valid_item(item_id) + return item if item != null and item.active else null diff --git a/inventory/player_hotbar.gd b/inventory/player_hotbar.gd index e9dbcec..a71ab68 100644 --- a/inventory/player_hotbar.gd +++ b/inventory/player_hotbar.gd @@ -249,7 +249,7 @@ func _can_assign(item_id: StringName) -> bool: if _catalog == null: return false var item: ItemDataType = _catalog.get_item_by_id(item_id) - return item != null and item.is_valid() and item.hotbar_allowed + return item != null and item.is_available() and item.hotbar_allowed func _can_assign_fish(catch_id: StringName) -> bool: diff --git a/items/catalog/art_kit.tres b/items/catalog/art_kit.tres index ee5b28e..e59705d 100644 --- a/items/catalog/art_kit.tres +++ b/items/catalog/art_kit.tres @@ -7,7 +7,7 @@ script = ExtResource("1_item") item_id = &"art_kit" display_name = "Art Kit" -description = "Press P in the game world to paint!" +description = "Select the Art Kit in the Hotbar to paint." category = 1 icon = ExtResource("2_icon") stackable = false diff --git a/items/catalog/basic_fishing_rod.tres b/items/catalog/basic_fishing_rod.tres index f43f9ca..9849b89 100644 --- a/items/catalog/basic_fishing_rod.tres +++ b/items/catalog/basic_fishing_rod.tres @@ -1,6 +1,6 @@ -[gd_resource type="Resource" script_class="ItemData" load_steps=3 format=3] +[gd_resource type="Resource" script_class="FishingRodData" load_steps=3 format=3] -[ext_resource type="Script" path="res://items/item_data.gd" id="1_script"] +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] [ext_resource type="Texture2D" path="res://items/icons/equipment/64_rod_base_thick.png" id="2_icon"] [resource] @@ -8,6 +8,7 @@ script = ExtResource("1_script") item_id = &"basic_fishing_rod" display_name = "basic fishing rod" description = "a dependable starter rod. select it to cast." +active = true category = 0 icon = ExtResource("2_icon") stackable = false @@ -15,3 +16,8 @@ max_stack = 1 usable = true equippable = true hotbar_allowed = true +shop_order = 1 +shop_price = 0 +unlock_level = 1 +effect_summary = "neutral baseline with no catch-selection or handling modifiers." +tradeoff = "none." diff --git a/items/catalog/cooler_expansion.tres b/items/catalog/cooler_expansion.tres deleted file mode 100644 index 2e9ed29..0000000 --- a/items/catalog/cooler_expansion.tres +++ /dev/null @@ -1,17 +0,0 @@ -[gd_resource type="Resource" script_class="ItemData" load_steps=3 format=3] - -[ext_resource type="Script" path="res://items/item_data.gd" id="1"] -[ext_resource type="Texture2D" path="res://items/icons/placeholder/cooler_expansion.svg" id="2"] - -[resource] -script = ExtResource("1") -item_id = &"cooler_expansion" -display_name = "cooler expansion" -description = "permanently increases the number of fish the cooler can hold." -category = 4 -icon = ExtResource("2") -stackable = false -max_stack = 1 -usable = false -equippable = false -hotbar_allowed = false diff --git a/items/catalog/item_catalog.tres b/items/catalog/item_catalog.tres index 43377ba..5f2ac3f 100644 --- a/items/catalog/item_catalog.tres +++ b/items/catalog/item_catalog.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="ItemCatalog" load_steps=18 format=3] +[gd_resource type="Resource" script_class="ItemCatalog" load_steps=38 format=3] [ext_resource type="Script" path="res://items/item_catalog.gd" id="1_script"] [ext_resource type="Resource" path="res://items/catalog/basic_fishing_rod.tres" id="2_rod"] @@ -6,7 +6,6 @@ [ext_resource type="Resource" path="res://items/catalog/energy_drink.tres" id="4_energy"] [ext_resource type="Resource" path="res://items/catalog/snack.tres" id="5_snack"] [ext_resource type="Resource" path="res://items/catalog/fish_finder.tres" id="6_finder"] -[ext_resource type="Resource" path="res://items/catalog/cooler_expansion.tres" id="7_cooler"] [ext_resource type="Resource" path="res://items/catalog/art_kit.tres" id="8_art_kit"] [ext_resource type="Resource" path="res://items/catalog/worms.tres" id="9_worms"] [ext_resource type="Resource" path="res://items/catalog/snails.tres" id="10_snails"] @@ -17,7 +16,28 @@ [ext_resource type="Resource" path="res://items/catalog/luminous_roe.tres" id="15_roe"] [ext_resource type="Resource" path="res://items/catalog/the_standby.tres" id="16_standby"] [ext_resource type="Resource" path="res://items/catalog/batteries.tres" id="17_batteries"] +[ext_resource type="Resource" path="res://items/catalog/rods/cardboard_classic_rod.tres" id="18_cardboard"] +[ext_resource type="Resource" path="res://items/catalog/rods/pond_skipper_rod.tres" id="19_pond"] +[ext_resource type="Resource" path="res://items/catalog/rods/river_runner_rod.tres" id="20_river"] +[ext_resource type="Resource" path="res://items/catalog/rods/lake_lunker_rod.tres" id="21_lake"] +[ext_resource type="Resource" path="res://items/catalog/rods/salt_spray_rod.tres" id="22_salt"] +[ext_resource type="Resource" path="res://items/catalog/rods/whisker_stick_rod.tres" id="23_whisker"] +[ext_resource type="Resource" path="res://items/catalog/rods/reef_raker_rod.tres" id="24_reef"] +[ext_resource type="Resource" path="res://items/catalog/rods/moonbeam_rod.tres" id="25_moonbeam"] +[ext_resource type="Resource" path="res://items/catalog/rods/sun_chaser_rod.tres" id="26_sun"] +[ext_resource type="Resource" path="res://items/catalog/rods/rainmaker_rod.tres" id="27_rain"] +[ext_resource type="Resource" path="res://items/catalog/rods/fogcatcher_rod.tres" id="28_fog"] +[ext_resource type="Resource" path="res://items/catalog/rods/field_guide_rod.tres" id="29_guide"] +[ext_resource type="Resource" path="res://items/catalog/rods/small_fry_rod.tres" id="30_small"] +[ext_resource type="Resource" path="res://items/catalog/rods/heavy_hauler_rod.tres" id="31_heavy"] +[ext_resource type="Resource" path="res://items/catalog/rods/pocket_rocket_rod.tres" id="32_rocket"] +[ext_resource type="Resource" path="res://items/catalog/rods/lucky_twig_rod.tres" id="33_lucky"] +[ext_resource type="Resource" path="res://items/catalog/rods/showboat_rod.tres" id="34_showboat"] +[ext_resource type="Resource" path="res://items/catalog/rods/deep_blue_rod.tres" id="35_deep"] +[ext_resource type="Resource" path="res://items/catalog/rods/oddity_string_rod.tres" id="36_oddity"] +[ext_resource type="Resource" path="res://items/catalog/rods/aurora_rod.tres" id="37_aurora"] +[ext_resource type="Resource" path="res://items/catalog/magnet.tres" id="38_magnet"] [resource] script = ExtResource("1_script") -items = [ExtResource("2_rod"), ExtResource("3_coffee"), ExtResource("4_energy"), ExtResource("5_snack"), ExtResource("6_finder"), ExtResource("7_cooler"), ExtResource("8_art_kit"), ExtResource("9_worms"), ExtResource("10_snails"), ExtResource("11_shrimp"), ExtResource("12_squid"), ExtResource("14_sardine"), ExtResource("13_anchovy"), ExtResource("15_roe"), ExtResource("16_standby"), ExtResource("17_batteries")] +items = [ExtResource("2_rod"), ExtResource("3_coffee"), ExtResource("4_energy"), ExtResource("5_snack"), ExtResource("6_finder"), ExtResource("8_art_kit"), ExtResource("9_worms"), ExtResource("10_snails"), ExtResource("11_shrimp"), ExtResource("12_squid"), ExtResource("14_sardine"), ExtResource("13_anchovy"), ExtResource("15_roe"), ExtResource("16_standby"), ExtResource("17_batteries"), ExtResource("18_cardboard"), ExtResource("19_pond"), ExtResource("20_river"), ExtResource("21_lake"), ExtResource("22_salt"), ExtResource("23_whisker"), ExtResource("24_reef"), ExtResource("25_moonbeam"), ExtResource("26_sun"), ExtResource("27_rain"), ExtResource("28_fog"), ExtResource("29_guide"), ExtResource("30_small"), ExtResource("31_heavy"), ExtResource("32_rocket"), ExtResource("33_lucky"), ExtResource("34_showboat"), ExtResource("35_deep"), ExtResource("36_oddity"), ExtResource("37_aurora"), ExtResource("38_magnet")] diff --git a/items/catalog/luminous_roe.tres b/items/catalog/luminous_roe.tres index 7814f42..677563e 100644 --- a/items/catalog/luminous_roe.tres +++ b/items/catalog/luminous_roe.tres @@ -7,7 +7,7 @@ script = ExtResource("1") item_id = &"luminous_roe" display_name = "luminous roe" -description = "rare glowing roe with the strongest rare catch odds." +description = "rare glowing roe with the strongest rarity and quality odds." icon = ExtResource("2_icon") category = 2 bait_tags = Array[StringName]([&"bait_rarity_6"]) diff --git a/items/catalog/magnet.tres b/items/catalog/magnet.tres new file mode 100644 index 0000000..eb2e25c --- /dev/null +++ b/items/catalog/magnet.tres @@ -0,0 +1,16 @@ +[gd_resource type="Resource" script_class="ItemData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/item_data.gd" id="1"] + +[resource] +script = ExtResource("1") +item_id = &"magnet" +display_name = "magnet" +description = "a heavy magnet ready for future magnet fishing." +active = true +category = 1 +stackable = false +max_stack = 1 +usable = false +equippable = false +hotbar_allowed = false diff --git a/items/catalog/rods/aurora_rod.tres b/items/catalog/rods/aurora_rod.tres new file mode 100644 index 0000000..303ce95 --- /dev/null +++ b/items/catalog/rods/aurora_rod.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"aurora_rod" +display_name = "aurora rod" +description = "a shifting ribbon of color for anglers who have tried nearly everything else." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 21 +shop_price = 5000 +unlock_level = 15 +bite_time_multiplier = 1.35 +reel_speed_multiplier = 0.9 +rarity_weight_multipliers = Array[float]([0.85, 1.00, 1.15, 1.30, 1.45]) +quality_weight_multipliers = Array[float]([0.80, 0.95, 1.15, 1.30, 1.45]) +effect_summary = "modestly improves both species rarity and catch quality across all eligible fish." +tradeoff = "the slowest bite cycle in the set; intended as an expensive late-game sidegrade." diff --git a/items/catalog/rods/cardboard_classic_rod.tres b/items/catalog/rods/cardboard_classic_rod.tres new file mode 100644 index 0000000..97a304f --- /dev/null +++ b/items/catalog/rods/cardboard_classic_rod.tres @@ -0,0 +1,26 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"cardboard_classic_rod" +display_name = "cardboard classic" +description = "a cheerful folded rod that gets bites quickly, if not impressively." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 2 +shop_price = 40 +unlock_level = 1 +bite_time_multiplier = 0.85 +reel_speed_multiplier = 0.95 +barrier_power_multiplier = 0.85 +rarity_weight_multipliers = Array[float]([1.20, 1.00, 0.85, 0.70, 0.55]) +quality_weight_multipliers = Array[float]([1.20, 1.05, 0.85, 0.70, 0.55]) +effect_summary = "shorter bite waits and a low-cost early sidegrade." +tradeoff = "leans toward common, lower-quality fish and has weaker handling." diff --git a/items/catalog/rods/deep_blue_rod.tres b/items/catalog/rods/deep_blue_rod.tres new file mode 100644 index 0000000..2d9b03f --- /dev/null +++ b/items/catalog/rods/deep_blue_rod.tres @@ -0,0 +1,27 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"deep_blue_rod" +display_name = "deep blue" +description = "a heavy navy rod for enormous shapes moving far offshore." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 19 +shop_price = 2500 +unlock_level = 12 +preferred_collection_groups = Array[StringName]([&"Coastal sharks", &"Large coastal predators", &"Oceanic billfish", &"Oceanic pelagic fish", &"Oceanic tuna", &"Open-ocean giants"]) +affinity_weight_multiplier = 1.75 +weight_roll_bias = 0.32 +bite_time_multiplier = 1.28 +reel_speed_multiplier = 0.82 +barrier_power_multiplier = 1.25 +effect_summary = "favors large ocean predator and pelagic collection groups and biases weight upward." +tradeoff = "very long bite waits and slower reeling." diff --git a/items/catalog/rods/field_guide_rod.tres b/items/catalog/rods/field_guide_rod.tres new file mode 100644 index 0000000..2b19f30 --- /dev/null +++ b/items/catalog/rods/field_guide_rod.tres @@ -0,0 +1,23 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"field_guide_rod" +display_name = "field guide rod" +description = "a note-covered rod that keeps tugging toward something new." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 13 +shop_price = 1350 +unlock_level = 8 +undiscovered_weight_multiplier = 1.9 +bite_time_multiplier = 1.15 +effect_summary = "substantially increases the relative weight of eligible undiscovered species." +tradeoff = "longer bite waits and no bonus after a species is discovered." diff --git a/items/catalog/rods/fogcatcher_rod.tres b/items/catalog/rods/fogcatcher_rod.tres new file mode 100644 index 0000000..c0fdd25 --- /dev/null +++ b/items/catalog/rods/fogcatcher_rod.tres @@ -0,0 +1,23 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"fogcatcher_rod" +display_name = "fogcatcher" +description = "a hazy blue rod for fish that prefer not to be seen." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 12 +shop_price = 1100 +unlock_level = 7 +weather_affinity = 2 +affinity_weight_multiplier = 1.65 +effect_summary = "strongly favors eligible fog-active fish." +tradeoff = "its affinity provides no benefit outside foggy weather." diff --git a/items/catalog/rods/heavy_hauler_rod.tres b/items/catalog/rods/heavy_hauler_rod.tres new file mode 100644 index 0000000..bc68c78 --- /dev/null +++ b/items/catalog/rods/heavy_hauler_rod.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"heavy_hauler_rod" +display_name = "heavy hauler" +description = "a thick rod that would rather bring home one enormous fish." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 15 +shop_price = 1500 +unlock_level = 9 +weight_roll_bias = 0.28 +bite_time_multiplier = 1.18 +reel_speed_multiplier = 0.88 +barrier_power_multiplier = 1.2 +effect_summary = "biases fish weight upward and adds barrier power." +tradeoff = "longer bite waits and slower reeling." diff --git a/items/catalog/rods/lake_lunker_rod.tres b/items/catalog/rods/lake_lunker_rod.tres new file mode 100644 index 0000000..4d30f56 --- /dev/null +++ b/items/catalog/rods/lake_lunker_rod.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"lake_lunker_rod" +display_name = "lake lunker" +description = "a broad, patient rod that favors hefty catches from open lakes." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 5 +shop_price = 400 +unlock_level = 4 +preferred_location_tags = Array[StringName]([&"lake"]) +affinity_weight_multiplier = 1.45 +weight_roll_bias = 0.12 +bite_time_multiplier = 1.05 +effect_summary = "favors eligible lake fish and gently biases weight rolls upward." +tradeoff = "slightly longer bite waits." diff --git a/items/catalog/rods/lucky_twig_rod.tres b/items/catalog/rods/lucky_twig_rod.tres new file mode 100644 index 0000000..8c26b19 --- /dev/null +++ b/items/catalog/rods/lucky_twig_rod.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"lucky_twig_rod" +display_name = "lucky twig" +description = "an ordinary-looking branch that insists it is extremely lucky." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 17 +shop_price = 1800 +unlock_level = 10 +bite_time_multiplier = 1.2 +reel_speed_multiplier = 0.9 +barrier_power_multiplier = 0.85 +rarity_weight_multipliers = Array[float]([0.65, 1.00, 1.35, 1.65, 2.00]) +effect_summary = "strongly shifts species rarity toward rare, epic, and legendary fish." +tradeoff = "longer bite waits, slower reeling, and weaker barrier power." diff --git a/items/catalog/rods/moonbeam_rod.tres b/items/catalog/rods/moonbeam_rod.tres new file mode 100644 index 0000000..df83634 --- /dev/null +++ b/items/catalog/rods/moonbeam_rod.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"moonbeam_rod" +display_name = "moonbeam rod" +description = "a pale rod that wakes up when the island goes quiet." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 9 +shop_price = 950 +unlock_level = 6 +time_affinity = 2 +affinity_weight_multiplier = 1.5 +bite_time_multiplier = 1.08 +quality_weight_multipliers = Array[float]([0.95, 0.98, 1.00, 1.08, 1.25]) +effect_summary = "favors eligible night fish and gives shiny quality a modest lift." +tradeoff = "slightly longer bite waits." diff --git a/items/catalog/rods/oddity_string_rod.tres b/items/catalog/rods/oddity_string_rod.tres new file mode 100644 index 0000000..8c51739 --- /dev/null +++ b/items/catalog/rods/oddity_string_rod.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"oddity_string_rod" +display_name = "oddity string" +description = "a crooked spool of string that attracts fish with questionable silhouettes." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 20 +shop_price = 2600 +unlock_level = 12 +preferred_collection_groups = Array[StringName]([&"Brackish oddities", &"Coastal oddities", &"Deep-sea oddities", &"Freshwater oddities", &"Reef oddities"]) +affinity_weight_multiplier = 1.8 +bite_time_multiplier = 1.18 +quality_weight_multipliers = Array[float]([1.10, 1.05, 0.95, 0.90, 0.90]) +effect_summary = "favors eligible fish from authored oddity collection groups." +tradeoff = "longer bite waits and a slight average-quality penalty." diff --git a/items/catalog/rods/pocket_rocket_rod.tres b/items/catalog/rods/pocket_rocket_rod.tres new file mode 100644 index 0000000..b93d348 --- /dev/null +++ b/items/catalog/rods/pocket_rocket_rod.tres @@ -0,0 +1,25 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"pocket_rocket_rod" +display_name = "pocket rocket" +description = "a buzzing pocket-sized rod for anglers in a hurry." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 16 +shop_price = 1400 +unlock_level = 9 +bite_time_multiplier = 0.7 +reel_speed_multiplier = 1.25 +barrier_power_multiplier = 0.8 +rarity_weight_multipliers = Array[float]([1.15, 1.00, 0.85, 0.72, 0.60]) +effect_summary = "greatly shortens bite waits and reels faster." +tradeoff = "reduces higher-rarity odds and barrier power." diff --git a/items/catalog/rods/pond_skipper_rod.tres b/items/catalog/rods/pond_skipper_rod.tres new file mode 100644 index 0000000..adb18e4 --- /dev/null +++ b/items/catalog/rods/pond_skipper_rod.tres @@ -0,0 +1,24 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"pond_skipper_rod" +display_name = "pond skipper" +description = "a springy little rod that feels at home beside quiet ponds." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 3 +shop_price = 150 +unlock_level = 2 +preferred_location_tags = Array[StringName]([&"starter_pond", &"pond"]) +affinity_weight_multiplier = 1.5 +bite_time_multiplier = 0.95 +effect_summary = "increases the relative selection weight of eligible pond fish." +tradeoff = "none; a focused sidegrade rather than a direct upgrade." diff --git a/items/catalog/rods/rainmaker_rod.tres b/items/catalog/rods/rainmaker_rod.tres new file mode 100644 index 0000000..3a407fd --- /dev/null +++ b/items/catalog/rods/rainmaker_rod.tres @@ -0,0 +1,23 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"rainmaker_rod" +display_name = "rainmaker" +description = "a drip-shaped rod that becomes unusually lucky in the rain." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 11 +shop_price = 1100 +unlock_level = 7 +weather_affinity = 1 +affinity_weight_multiplier = 1.65 +effect_summary = "strongly favors eligible rain-active fish." +tradeoff = "its affinity provides no benefit outside rainy weather." diff --git a/items/catalog/rods/reef_raker_rod.tres b/items/catalog/rods/reef_raker_rod.tres new file mode 100644 index 0000000..2b3ff91 --- /dev/null +++ b/items/catalog/rods/reef_raker_rod.tres @@ -0,0 +1,24 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"reef_raker_rod" +display_name = "reef raker" +description = "a bright hooked rod tuned for the crowded life around reefs." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 8 +shop_price = 900 +unlock_level = 6 +preferred_collection_groups = Array[StringName]([&"Cold reef fish", &"Reef ambush fish", &"Reef eels", &"Reef flatfish", &"Reef grazers", &"Reef oddities", &"Reef ornamentals", &"Reef predators", &"Reef schooling fish", &"Reef snapper", &"Reef wrasses", &"Temperate reef fish", &"Temperate reef predators"]) +affinity_weight_multiplier = 1.45 +quality_weight_multipliers = Array[float]([0.95, 1.00, 1.12, 1.05, 1.00]) +effect_summary = "favors eligible reef collection groups and modestly favors impressive quality." +tradeoff = "no advantage away from reef-associated fish." diff --git a/items/catalog/rods/river_runner_rod.tres b/items/catalog/rods/river_runner_rod.tres new file mode 100644 index 0000000..7f0a464 --- /dev/null +++ b/items/catalog/rods/river_runner_rod.tres @@ -0,0 +1,24 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"river_runner_rod" +display_name = "river runner" +description = "a lively rod made to keep pace with moving river water." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 4 +shop_price = 250 +unlock_level = 3 +preferred_location_tags = Array[StringName]([&"river"]) +affinity_weight_multiplier = 1.5 +reel_speed_multiplier = 1.05 +effect_summary = "increases the relative selection weight of eligible river fish." +tradeoff = "none; a focused sidegrade rather than a direct upgrade." diff --git a/items/catalog/rods/salt_spray_rod.tres b/items/catalog/rods/salt_spray_rod.tres new file mode 100644 index 0000000..f3e6102 --- /dev/null +++ b/items/catalog/rods/salt_spray_rod.tres @@ -0,0 +1,24 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"salt_spray_rod" +display_name = "salt spray" +description = "a sea-green rod that seems happiest with salt on the line." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 6 +shop_price = 600 +unlock_level = 5 +preferred_location_tags = Array[StringName]([&"ocean"]) +affinity_weight_multiplier = 1.5 +rarity_weight_multipliers = Array[float]([0.95, 1.00, 1.05, 1.05, 1.05]) +effect_summary = "increases the relative selection weight of eligible ocean fish." +tradeoff = "none; a focused sidegrade rather than a direct upgrade." diff --git a/items/catalog/rods/showboat_rod.tres b/items/catalog/rods/showboat_rod.tres new file mode 100644 index 0000000..99bef41 --- /dev/null +++ b/items/catalog/rods/showboat_rod.tres @@ -0,0 +1,24 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"showboat_rod" +display_name = "showboat" +description = "a theatrical rod that refuses to land an unimpressive fish quietly." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 18 +shop_price = 2000 +unlock_level = 11 +bite_time_multiplier = 1.18 +reel_speed_multiplier = 0.9 +quality_weight_multipliers = Array[float]([0.50, 0.75, 1.35, 1.70, 2.10]) +effect_summary = "strongly shifts catch quality toward impressive, exceptional, and shiny." +tradeoff = "longer bite waits and slower reeling; species rarity is unchanged." diff --git a/items/catalog/rods/small_fry_rod.tres b/items/catalog/rods/small_fry_rod.tres new file mode 100644 index 0000000..a1631f0 --- /dev/null +++ b/items/catalog/rods/small_fry_rod.tres @@ -0,0 +1,23 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"small_fry_rod" +display_name = "small fry" +description = "a tiny rod for anglers who value character over size." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 14 +shop_price = 1200 +unlock_level = 8 +weight_roll_bias = -0.25 +quality_weight_multipliers = Array[float]([0.75, 0.90, 1.25, 1.40, 1.55]) +effect_summary = "biases fish weight downward while improving high-quality outcomes." +tradeoff = "produces smaller catches on average." diff --git a/items/catalog/rods/sun_chaser_rod.tres b/items/catalog/rods/sun_chaser_rod.tres new file mode 100644 index 0000000..22c0803 --- /dev/null +++ b/items/catalog/rods/sun_chaser_rod.tres @@ -0,0 +1,24 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"sun_chaser_rod" +display_name = "sun chaser" +description = "a warm cream rod that likes bright mornings and busy afternoons." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 10 +shop_price = 950 +unlock_level = 6 +time_affinity = 1 +affinity_weight_multiplier = 1.4 +rarity_weight_multipliers = Array[float]([0.95, 1.00, 1.12, 1.08, 1.00]) +effect_summary = "favors eligible daytime fish and modestly improves rare-species odds." +tradeoff = "none; a focused sidegrade rather than a direct upgrade." diff --git a/items/catalog/rods/whisker_stick_rod.tres b/items/catalog/rods/whisker_stick_rod.tres new file mode 100644 index 0000000..a49ff63 --- /dev/null +++ b/items/catalog/rods/whisker_stick_rod.tres @@ -0,0 +1,24 @@ +[gd_resource type="Resource" script_class="FishingRodData" load_steps=2 format=3] + +[ext_resource type="Script" path="res://items/fishing_rod_data.gd" id="1_script"] + +[resource] +script = ExtResource("1_script") +item_id = &"whisker_stick_rod" +display_name = "whisker stick" +description = "a bendy rod with a suspicious talent for finding catfish." +active = false +category = 0 +stackable = false +max_stack = 1 +usable = true +equippable = true +hotbar_allowed = true +shop_order = 7 +shop_price = 750 +unlock_level = 5 +preferred_collection_groups = Array[StringName]([&"Freshwater catfish"]) +affinity_weight_multiplier = 1.7 +bite_time_multiplier = 1.08 +effect_summary = "strongly favors eligible fish in the Freshwater catfish collection group." +tradeoff = "slightly longer bite waits while it searches for whiskers." diff --git a/items/catalog/shrimp.tres b/items/catalog/shrimp.tres index e308163..6864265 100644 --- a/items/catalog/shrimp.tres +++ b/items/catalog/shrimp.tres @@ -7,7 +7,7 @@ script = ExtResource("1") item_id = &"shrimp" display_name = "shrimp" -description = "lively bait that noticeably improves rare catch chances." +description = "lively bait that noticeably improves rarity and quality odds." icon = ExtResource("2_icon") category = 2 bait_tags = Array[StringName]([&"bait_rarity_2"]) diff --git a/items/catalog/snails.tres b/items/catalog/snails.tres index 12d4497..adddefb 100644 --- a/items/catalog/snails.tres +++ b/items/catalog/snails.tres @@ -7,7 +7,7 @@ script = ExtResource("1") item_id = &"snails" display_name = "snails" -description = "slow-moving bait with a better chance for rarer catches." +description = "slow-moving bait with better rarity and quality odds." icon = ExtResource("2_icon") category = 2 bait_tags = Array[StringName]([&"bait_rarity_1"]) diff --git a/items/catalog/squid_chunks.tres b/items/catalog/squid_chunks.tres index dfe245f..bf0da93 100644 --- a/items/catalog/squid_chunks.tres +++ b/items/catalog/squid_chunks.tres @@ -7,7 +7,7 @@ script = ExtResource("1") item_id = &"squid_chunks" display_name = "squid chunks" -description = "rich cut bait that strongly favors rarer catches." +description = "rich cut bait that strongly favors rarer, higher-quality catches." icon = ExtResource("2_icon") category = 2 bait_tags = Array[StringName]([&"bait_rarity_3"]) diff --git a/items/catalog/whole_anchovy.tres b/items/catalog/whole_anchovy.tres index cbc60b6..b52018b 100644 --- a/items/catalog/whole_anchovy.tres +++ b/items/catalog/whole_anchovy.tres @@ -7,7 +7,7 @@ script = ExtResource("1") item_id = &"whole_anchovy" display_name = "sardine" -description = "valuable oily schooling bait tuned for exceptional catches." +description = "valuable oily schooling bait tuned for exceptional rarity and quality odds." icon = ExtResource("2_icon") category = 2 bait_tags = Array[StringName]([&"bait_rarity_5"]) diff --git a/items/catalog/whole_sardine.tres b/items/catalog/whole_sardine.tres index c5d0163..78a0e0e 100644 --- a/items/catalog/whole_sardine.tres +++ b/items/catalog/whole_sardine.tres @@ -7,7 +7,7 @@ script = ExtResource("1") item_id = &"whole_sardine" display_name = "minnow" -description = "small live bait with high rare catch potential." +description = "small live bait with strong rarity and quality potential." icon = ExtResource("2_icon") category = 2 bait_tags = Array[StringName]([&"bait_rarity_4"]) diff --git a/items/catalog/worms.tres b/items/catalog/worms.tres index f01258e..71bd744 100644 --- a/items/catalog/worms.tres +++ b/items/catalog/worms.tres @@ -7,7 +7,7 @@ script = ExtResource("1") item_id = &"worms" display_name = "worms" -description = "basic bait that opens a small chance for rarer catches." +description = "basic bait that opens a small chance for rarer, higher-quality catches." icon = ExtResource("2_icon") category = 2 bait_tags = Array[StringName]([&"worm", &"bait_rarity_0"]) diff --git a/items/fishing_rod_data.gd b/items/fishing_rod_data.gd new file mode 100644 index 0000000..d1c8e7c --- /dev/null +++ b/items/fishing_rod_data.gd @@ -0,0 +1,151 @@ +class_name FishingRodData +extends ItemData + +const FishDataType = preload("res://fish/fish_data.gd") +const FishingContextType = preload("res://fishing/fishing_context.gd") + +enum TimeAffinity { + ANY, + DAY, + NIGHT, +} + +enum WeatherAffinity { + ANY, + RAIN, + FOG, +} + +const MULTIPLIER_COUNT: int = 5 + +@export_category("Rod Shop") +@export var shop_enabled: bool = true +@export_range(1, 999, 1) var shop_order: int = 1 +@export_range(0, 1000000, 1) var shop_price: int = 0 +@export_range(1, 100000, 1) var unlock_level: int = 1 + +@export_category("Rod Presentation") +## Optional authored visual. A null scene deliberately uses the current +## temporary rod mesh so new rod data never requires a model to function. +@export var rod_model_scene: PackedScene +@export var rod_model_transform: Transform3D = Transform3D.IDENTITY +@export var rod_tip_position := Vector3(0.0, 1.1, 0.0) + +@export_category("Rod Affinity") +@export var preferred_location_tags: Array[StringName] = [] +@export var preferred_collection_groups: Array[StringName] = [] +@export var time_affinity: TimeAffinity = TimeAffinity.ANY +@export var weather_affinity: WeatherAffinity = WeatherAffinity.ANY +@export_range(0.0, 10.0, 0.01) var affinity_weight_multiplier: float = 1.0 +@export_range(0.0, 10.0, 0.01) var undiscovered_weight_multiplier: float = 1.0 + +@export_category("Rod Catch Modifiers") +@export_range(-0.5, 0.5, 0.01) var weight_roll_bias: float = 0.0 +@export_range(0.05, 5.0, 0.01) var bite_time_multiplier: float = 1.0 +@export_range(0.05, 5.0, 0.01) var reel_speed_multiplier: float = 1.0 +@export_range(0.05, 5.0, 0.01) var barrier_power_multiplier: float = 1.0 +@export var rarity_weight_multipliers: Array[float] = [ + 1.0, 1.0, 1.0, 1.0, 1.0, +] +@export var quality_weight_multipliers: Array[float] = [ + 1.0, 1.0, 1.0, 1.0, 1.0, +] +@export_multiline var effect_summary: String +@export_multiline var tradeoff: String + + +func is_valid() -> bool: + return ( + super.is_valid() + and category == Category.ROD + and shop_order >= 1 + and shop_price >= 0 + and unlock_level >= 1 + and rarity_weight_multipliers.size() == MULTIPLIER_COUNT + and quality_weight_multipliers.size() == MULTIPLIER_COUNT + and _multipliers_are_non_negative(rarity_weight_multipliers) + and _multipliers_are_non_negative(quality_weight_multipliers) + and affinity_weight_multiplier >= 0.0 + and undiscovered_weight_multiplier >= 0.0 + and bite_time_multiplier > 0.0 + and reel_speed_multiplier > 0.0 + and barrier_power_multiplier > 0.0 + ) + + +func is_shop_available() -> bool: + return is_available() and shop_enabled and icon != null + + +func get_affinity_multiplier( + fish: FishDataType, + context: FishingContextType, +) -> float: + if fish == null or context == null or not _has_authored_affinity(): + return 1.0 + if ( + not preferred_location_tags.is_empty() + and not _has_any_match( + preferred_location_tags, + context.location_tags, + ) + ): + return 1.0 + if ( + not preferred_collection_groups.is_empty() + and fish.collection_group not in preferred_collection_groups + ): + return 1.0 + match time_affinity: + TimeAffinity.DAY: + if context.is_night or context.is_day_night_transition: + return 1.0 + TimeAffinity.NIGHT: + if not context.is_night or context.is_day_night_transition: + return 1.0 + match weather_affinity: + WeatherAffinity.RAIN: + if not context.is_raining: + return 1.0 + WeatherAffinity.FOG: + if not context.is_foggy: + return 1.0 + return maxf(affinity_weight_multiplier, 0.0) + + +func get_rarity_multiplier(rarity: int) -> float: + if rarity < 0 or rarity >= rarity_weight_multipliers.size(): + return 1.0 + return maxf(rarity_weight_multipliers[rarity], 0.0) + + +func get_quality_multiplier(quality: int) -> float: + if quality < 0 or quality >= quality_weight_multipliers.size(): + return 1.0 + return maxf(quality_weight_multipliers[quality], 0.0) + + +func _has_authored_affinity() -> bool: + return ( + not preferred_location_tags.is_empty() + or not preferred_collection_groups.is_empty() + or time_affinity != TimeAffinity.ANY + or weather_affinity != WeatherAffinity.ANY + ) + + +func _has_any_match( + expected: Array[StringName], + actual: Array[StringName], +) -> bool: + for value: StringName in expected: + if value in actual: + return true + return false + + +func _multipliers_are_non_negative(values: Array[float]) -> bool: + for value: float in values: + if not is_finite(value) or value < 0.0: + return false + return true diff --git a/items/fishing_rod_data.gd.uid b/items/fishing_rod_data.gd.uid new file mode 100644 index 0000000..324cfd7 --- /dev/null +++ b/items/fishing_rod_data.gd.uid @@ -0,0 +1 @@ +uid://car3ne3q6dhln diff --git a/items/icons/placeholder/cooler_expansion.svg b/items/icons/placeholder/cooler_expansion.svg deleted file mode 100644 index 105bff7..0000000 --- a/items/icons/placeholder/cooler_expansion.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/items/icons/placeholder/cooler_expansion.svg.import b/items/icons/placeholder/cooler_expansion.svg.import deleted file mode 100644 index fbcc85c..0000000 --- a/items/icons/placeholder/cooler_expansion.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://d115jiqughf40" -path="res://.godot/imported/cooler_expansion.svg-a3d63bc21ba230007f1039372b518c8f.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://items/icons/placeholder/cooler_expansion.svg" -dest_files=["res://.godot/imported/cooler_expansion.svg-a3d63bc21ba230007f1039372b518c8f.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/items/item_catalog.gd b/items/item_catalog.gd index b4245a0..511604b 100644 --- a/items/item_catalog.gd +++ b/items/item_catalog.gd @@ -28,3 +28,16 @@ func get_valid_items() -> Array[ItemDataType]: seen[item.item_id] = true result.append(item) return result + + +func get_available_item_by_id(item_id: StringName) -> ItemDataType: + var item: ItemDataType = get_item_by_id(item_id) + return item if item != null and item.is_available() else null + + +func get_available_items() -> Array[ItemDataType]: + var result: Array[ItemDataType] = [] + for item: ItemDataType in get_valid_items(): + if item.active: + result.append(item) + return result diff --git a/items/item_data.gd b/items/item_data.gd index a34cec0..72ac0d6 100644 --- a/items/item_data.gd +++ b/items/item_data.gd @@ -15,6 +15,11 @@ enum Category { @export var item_id: StringName @export var display_name: String @export_multiline var description: String +@export_category("Developer Catalog") +## Inactive items remain resolvable for existing saves, but cannot be newly +## acquired, equipped, used, or presented in shops. +@export var active: bool = true +@export_category("Item") @export var category: Category = Category.UTILITY @export var bait_tags: Array[StringName] = [] @export var lure_effects: Array[StringName] = [] @@ -35,6 +40,10 @@ func is_valid() -> bool: ) +func is_available() -> bool: + return active and is_valid() + + func get_category_name() -> String: return Category.keys()[category].to_lower() diff --git a/jobs/player_job_service.gd b/jobs/player_job_service.gd index 18d6f89..7f3be92 100644 --- a/jobs/player_job_service.gd +++ b/jobs/player_job_service.gd @@ -454,7 +454,7 @@ func _generate_host_board(cycle: int) -> void: var candidates: Array[FishDataType] = [] if _catalog != null: for fish: FishDataType in _catalog.candidates: - if fish != null: + if fish != null and fish.is_selectable(): candidates.append(fish) var schedule_anchor_index: int = _current_weather_segment() var allow_weather_jobs: bool = ( @@ -727,7 +727,7 @@ func _matches_canonical_board(board: Dictionary) -> bool: var candidates: Array[FishDataType] = [] if _catalog != null: for fish: FishDataType in _catalog.candidates: - if fish != null: + if fish != null and fish.is_selectable(): candidates.append(fish) var anchor_index: int = int(board.get("schedule_anchor_index", -1)) var allow_weather_jobs: bool = ( diff --git a/main/main.gd b/main/main.gd index af27fed..4e1f28b 100644 --- a/main/main.gd +++ b/main/main.gd @@ -24,6 +24,7 @@ const PauseMenuType = preload("res://ui/pause_menu.gd") const ItemCatalogType = preload("res://items/item_catalog.gd") const ArtShopStockType = preload("res://economy/art_shop_stock.gd") const ItemDataType = preload("res://items/item_data.gd") +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const FishingShopType = preload("res://ui/fishing_shop.gd") const FishingShopInteractionType = preload( "res://world/fishing_shop_interaction.gd" @@ -334,6 +335,7 @@ func _start_dedicated_server() -> void: if not _network_session.set_host_open(true): _fail_dedicated_server("Could not open the dedicated server.") return + _player_jobs.begin_progression_session() if config.public_listing and not _discovery.set_discoverable(true): _network_session.disconnect_session("Discovery setup failed.") _fail_dedicated_server(_discovery.get_host_status_message()) @@ -560,7 +562,7 @@ func _initialize_application(dedicated: bool) -> void: _network_player_list.set_surface_drawing_service( _network_surface_drawing ) - _network_chat.setup(_network_session) + _network_chat.setup(_network_session, _world_time, _world_weather) _network_fishing.setup( _network_session, _player_spawn_service, @@ -1646,14 +1648,16 @@ func _handle_failed_session_switch(message: String) -> void: _show_title_music(true) -func _on_network_server_lost() -> void: +func _on_network_server_lost(message: String) -> void: if not _gameplay_started: return + _join_requested_from_title = false + _join_requested_from_pause = false + _pending_join_endpoint = "" _set_gameplay_active(false) var title_screen: TitleScreenType = _game_ui.get_title_screen() - title_screen.reopen() - title_screen.open_join_game_page(_pending_join_endpoint) - title_screen.report_network_error("The server connection was lost.") + title_screen.reopen_to_menu() + title_screen.report_network_error(message) _show_title_music(true) @@ -1761,15 +1765,20 @@ func _on_active_hotbar_item_changed( var item = item_catalog.get_item_by_id(item_id) var active_is_rod: bool = ( item != null + and item.is_available() and item.category == ItemDataType.Category.ROD and _player.bag.owns_item(item_id) ) var active_is_art_kit: bool = ( item_id == ArtShopStockType.ART_KIT_ITEM_ID and item != null + and item.is_available() and _player.bag.owns_item(item_id) ) - _player.set_active_item_is_rod(active_is_rod, true) + _player.set_active_fishing_rod( + item as FishingRodDataType if active_is_rod else null, + true, + ) _player.set_active_art_kit( item.icon if item != null else null, active_is_art_kit, diff --git a/network/network_chat_service.gd b/network/network_chat_service.gd index 368c529..50c47d3 100644 --- a/network/network_chat_service.gd +++ b/network/network_chat_service.gd @@ -5,6 +5,7 @@ const BURST_COUNT: int = 3 const WINDOW_COUNT: int = 5 const WINDOW_SECONDS: float = 10.0 const CALL_COOLDOWN_MILLISECONDS: int = 180 +const WORLD_COMMAND_COOLDOWN_MILLISECONDS: int = 500 const CALL_PITCH_VARIANTS: Array[float] = [ 0.96, 1.03, @@ -22,6 +23,7 @@ signal message_received(message: Dictionary) signal local_message_confirmed(message: Dictionary) signal send_rejected(message: String) signal history_replaced(messages: Array[Dictionary]) +signal world_command_finished(success: bool, message: String) signal character_call_received( peer_id: int, call_id: String, @@ -35,13 +37,22 @@ var _request_ledgers: Dictionary[int, Dictionary] = {} var _rate_times: Dictionary[int, Array] = {} var _last_call_msec: Dictionary[int, int] = {} var _call_variant_indices: Dictionary[int, int] = {} +var _last_world_command_msec: Dictionary[int, int] = {} var _sequence: int = 0 var _peer_names: Dictionary[int, String] = {} var _relationships: PlayerRelationshipStore +var _world_time: WorldTimeService +var _world_weather: WorldWeatherService -func setup(session: NetworkSession) -> void: +func setup( + session: NetworkSession, + world_time: WorldTimeService, + world_weather: WorldWeatherService, +) -> void: _session = session + _world_time = world_time + _world_weather = world_weather _session.peer_authenticated.connect(_on_peer_authenticated) _session.peer_removed.connect(_on_peer_removed) _session.state_changed.connect(_on_session_state_changed) @@ -242,6 +253,188 @@ func broadcast_system_message(body: String) -> bool: return true +func request_world_time_change(phase_name: String) -> bool: + var normalized: String = phase_name.strip_edges().to_lower() + if not _valid_time_phase(normalized) or _session == null: + return false + if _session.is_host(): + return _apply_world_time_change(normalized) + if ( + not _session.is_joined_client() + or not _session.is_local_operator() + or not _session.supports_server_capability( + NetworkProtocol.WORLD_TIME_CAPABILITY + ) + ): + return false + submit_world_time_command.rpc_id(1, normalized) + return true + + +func request_world_weather_change(weather_name: String) -> bool: + var normalized: String = _normalized_weather_name(weather_name) + if normalized.is_empty() or _session == null: + return false + if _session.is_host(): + return _apply_world_weather_change(normalized) + if ( + not _session.is_joined_client() + or not _session.is_local_operator() + or not _session.supports_server_capability( + NetworkProtocol.WORLD_WEATHER_CAPABILITY + ) + ): + return false + submit_world_weather_command.rpc_id(1, normalized) + return true + + +@rpc("any_peer", "call_remote", "reliable", NetworkChatProtocol.RELIABLE_CHANNEL) +func submit_world_time_command(phase_name: String) -> void: + var sender_id: int = multiplayer.get_remote_sender_id() + if not _valid_world_command_sender(sender_id): + _send_world_command_result( + sender_id, false, "Only the host or an operator can change world time." + ) + return + if not _consume_world_command_rate(sender_id): + _send_world_command_result(sender_id, false, "Slow down.") + return + var success: bool = _apply_world_time_change( + phase_name.strip_edges().to_lower() + ) + _send_world_command_result( + sender_id, + success, + "" if success else "World time could not be changed.", + ) + + +@rpc("any_peer", "call_remote", "reliable", NetworkChatProtocol.RELIABLE_CHANNEL) +func submit_world_weather_command(weather_name: String) -> void: + var sender_id: int = multiplayer.get_remote_sender_id() + if not _valid_world_command_sender(sender_id): + _send_world_command_result( + sender_id, + false, + "Only the host or an operator can change world weather.", + ) + return + if not _consume_world_command_rate(sender_id): + _send_world_command_result(sender_id, false, "Slow down.") + return + var success: bool = _apply_world_weather_change( + _normalized_weather_name(weather_name) + ) + _send_world_command_result( + sender_id, + success, + "" if success else "World weather could not be changed.", + ) + + +@rpc("authority", "call_remote", "reliable", NetworkChatProtocol.RELIABLE_CHANNEL) +func receive_world_command_result(success: bool, message: String) -> void: + if _session == null or not _session.is_joined_client(): + return + world_command_finished.emit(success, message.left(120)) + + +func _valid_world_command_sender(peer_id: int) -> bool: + return ( + _session != null + and _session.is_host() + and peer_id > 1 + and _session.is_authenticated_peer(peer_id) + and _session.is_peer_operator(peer_id) + ) + + +func _apply_world_time_change(phase_name: String) -> bool: + if _world_time == null or not _valid_time_phase(phase_name): + return false + var target_hour: float = _time_phase_hour(phase_name) + if not _world_time.set_authoritative_time(target_hour): + return false + broadcast_system_message( + "World time set to %s (%s)." + % [phase_name, _world_time.get_clock_text()] + ) + return true + + +func _apply_world_weather_change(weather_name: String) -> bool: + if _world_weather == null: + return false + var normalized: String = _normalized_weather_name(weather_name) + if normalized.is_empty(): + return false + var target_weather: WorldWeatherService.Weather = ( + _weather_for_name(normalized) + ) + if not _world_weather.set_authoritative_weather(target_weather): + return false + broadcast_system_message("World weather set to %s." % normalized) + return true + + +func _send_world_command_result( + peer_id: int, + success: bool, + message: String, +) -> void: + if peer_id > 1 and _session.is_authenticated_peer(peer_id): + receive_world_command_result.rpc_id(peer_id, success, message.left(120)) + + +func _consume_world_command_rate(peer_id: int) -> bool: + var now_msec: int = Time.get_ticks_msec() + var last_msec: int = _last_world_command_msec.get( + peer_id, now_msec - WORLD_COMMAND_COOLDOWN_MILLISECONDS + ) + if now_msec - last_msec < WORLD_COMMAND_COOLDOWN_MILLISECONDS: + return false + _last_world_command_msec[peer_id] = now_msec + return true + + +static func _valid_time_phase(phase_name: String) -> bool: + return phase_name in ["dawn", "day", "dusk", "night"] + + +static func _time_phase_hour(phase_name: String) -> float: + match phase_name: + "dawn": + return WorldTimeService.DAWN_START_HOUR + "day": + return WorldTimeService.DAWN_END_HOUR + "dusk": + return WorldTimeService.DUSK_START_HOUR + "night": + return WorldTimeService.DUSK_END_HOUR + return -1.0 + + +static func _normalized_weather_name(weather_name: String) -> String: + var normalized: String = weather_name.strip_edges().to_lower() + return "clear" if normalized == "sunny" else normalized if normalized in [ + "clear", "cloudy", "rainy", "foggy" + ] else "" + + +static func _weather_for_name( + weather_name: String, +) -> WorldWeatherService.Weather: + match weather_name: + "cloudy": + return WorldWeatherService.Weather.CLOUDY + "rainy": + return WorldWeatherService.Weather.RAINY + "foggy": + return WorldWeatherService.Weather.FOGGY + return WorldWeatherService.Weather.SUNNY + + func get_history() -> Array[Dictionary]: var result: Array[Dictionary] = [] for message: Dictionary in _history: @@ -422,6 +615,7 @@ func _on_peer_removed(peer_id: int) -> void: _rate_times.erase(peer_id) _last_call_msec.erase(peer_id) _call_variant_indices.erase(peer_id) + _last_world_command_msec.erase(peer_id) if not _session.is_host(): return var display_name: String = _peer_names.get(peer_id, "Player") @@ -481,6 +675,7 @@ func _on_session_state_changed(state: NetworkSession.State) -> void: _rate_times.clear() _last_call_msec.clear() _call_variant_indices.clear() + _last_world_command_msec.clear() _peer_names.clear() _sequence = 0 history_replaced.emit([]) diff --git a/network/network_fishing_attempt.gd b/network/network_fishing_attempt.gd index 3a1b1de..84511db 100644 --- a/network/network_fishing_attempt.gd +++ b/network/network_fishing_attempt.gd @@ -21,6 +21,7 @@ var origin: Vector3 var target: Vector3 var bobber_position: Vector3 var fish_id: StringName +var rod_id: StringName var bait_tags: Array[StringName] = [] var lure_effects: Array[StringName] = [] var encounter_seed: int = 0 diff --git a/network/network_fishing_service.gd b/network/network_fishing_service.gd index 2015681..f7e1623 100644 --- a/network/network_fishing_service.gd +++ b/network/network_fishing_service.gd @@ -5,6 +5,7 @@ const FishCatchType = preload("res://fish/fish_catch.gd") const FishDataType = preload("res://fish/fish_data.gd") const FishPoolType = preload("res://fish/fish_pool.gd") const FishSelectorType = preload("res://fish/fish_selector.gd") +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const FishingContextType = preload("res://fishing/fishing_context.gd") const CollectionLogType = preload("res://collection/collection_log.gd") const FishExperienceType = preload("res://fish/fish_experience.gd") @@ -254,10 +255,10 @@ func _handle_cast_request(peer_id: int, data: Dictionary) -> void: if not bool(data["capacity_available"]): _record_and_reject(peer_id, request_id, "Cooler is full.") return - var rod: ItemData = _item_catalog.get_item_by_id( + var rod := _item_catalog.get_item_by_id( StringName(str(data["rod_id"])) - ) - if rod == null or rod.category != ItemData.Category.ROD: + ) as FishingRodDataType + if rod == null or not rod.is_available(): _record_and_reject(peer_id, request_id, "Select a fishing rod to cast.") return var avatar: Player = _spawn_service.get_avatar(peer_id) @@ -312,7 +313,7 @@ func _handle_cast_request(peer_id: int, data: Dictionary) -> void: if _item_use != null else null ) var selected_fish: FishDataType = _select_authoritative_fish( - region, data, effects + region, data, effects, rod ) if selected_fish == null or not selected_fish.is_allowed_in_water( region.water_type @@ -339,6 +340,7 @@ func _handle_cast_request(peer_id: int, data: Dictionary) -> void: not lure_id.is_empty() and ( lure == null + or not lure.is_available() or not lure.is_lure() or ( owns_authoritative_bag @@ -353,6 +355,7 @@ func _handle_cast_request(peer_id: int, data: Dictionary) -> void: return if not bait_id.is_empty() and ( bait == null + or not bait.is_available() or not bait.is_bait() or ( owns_authoritative_bag @@ -374,20 +377,38 @@ func _handle_cast_request(peer_id: int, data: Dictionary) -> void: attempt.target = authoritative_target attempt.bobber_position = authoritative_target attempt.fish_id = selected_fish.id + attempt.rod_id = rod.item_id attempt.bait_tags = _bait_tags_for_request(data) attempt.lure_effects.clear() if lure != null: for effect_id: StringName in lure.lure_effects: attempt.lure_effects.append(effect_id) - attempt.reel_speed = float(data["reel_speed"]) * ( + var effect_reel_multiplier: float = ( effects.get_reel_multiplier() if effects != null else 1.0 ) - attempt.barrier_damage = int(data["barrier_damage"]) + ( + var effect_barrier_bonus: int = ( effects.get_barrier_bonus() if effects != null else 0 ) - attempt.bite_time_remaining = _fishing_spot.roll_bite_wait_time() * float( + var effect_bite_multiplier: float = ( effects.get_bite_time_multiplier() if effects != null else 1.0 ) + attempt.reel_speed = ( + float(data["reel_speed"]) + * effect_reel_multiplier + * rod.reel_speed_multiplier + ) + attempt.barrier_damage = maxi( + roundi( + (float(data["barrier_damage"]) + effect_barrier_bonus) + * rod.barrier_power_multiplier + ), + 1, + ) + attempt.bite_time_remaining = ( + _fishing_spot.roll_bite_wait_time() + * effect_bite_multiplier + * rod.bite_time_multiplier + ) attempt.controller = CatchController.new() add_child(attempt.controller) attempt.controller.encounter_updated.connect( @@ -472,6 +493,7 @@ func _select_authoritative_fish( region: FishableWaterRegion, data: Dictionary, effects: PlayerItemEffects, + rod: FishingRodDataType, ) -> FishDataType: var evidence_log := CollectionLogType.new() for value: Variant in data["discovered_fish_ids"]: @@ -480,6 +502,7 @@ func _select_authoritative_fish( return null evidence_log.mark_discovered(fish_id) var selector := FishSelectorType.new() + selector.active_rod = rod selector.undiscovered_weight_multiplier = ( _fishing_spot.undiscovered_weight_multiplier ) @@ -503,7 +526,11 @@ func _bait_tags_for_request(data: Dictionary) -> Array[StringName]: if bait_id.is_empty() or _item_catalog == null: return [] var bait: ItemDataType = _item_catalog.get_item_by_id(bait_id) - return bait.bait_tags.duplicate() if bait != null and bait.is_bait() else [] + return ( + bait.bait_tags.duplicate() + if bait != null and bait.is_available() and bait.is_bait() + else [] + ) func _set_bite_pending(attempt: NetworkFishingAttempt) -> void: @@ -527,13 +554,20 @@ func _start_bite(attempt: NetworkFishingAttempt) -> void: if attempt.phase != NetworkFishingAttempt.Phase.WAITING_FOR_BITE: return var fish: FishDataType = _fish_catalog.get_fish_by_id(attempt.fish_id) - if fish == null or fish.catch_profile == null: + var rod := _item_catalog.get_item_by_id(attempt.rod_id) as FishingRodDataType + if ( + fish == null + or fish.catch_profile == null + or rod == null + or not rod.is_available() + ): _cancel_attempt(attempt.owner_peer_id, "Fishing attempt ended.") return attempt.bite_confirmation_pending = false attempt.phase = NetworkFishingAttempt.Phase.FIGHTING attempt.encounter_seed = _new_seed() var selector := FishSelectorType.new() + selector.active_rod = rod selector.use_deterministic_test_seed = true selector.deterministic_test_seed = attempt.encounter_seed ^ 0x5F3759DF selector.begin_roll() diff --git a/network/network_item_use_service.gd b/network/network_item_use_service.gd index f39d198..9b47b41 100644 --- a/network/network_item_use_service.gd +++ b/network/network_item_use_service.gd @@ -1,6 +1,8 @@ class_name NetworkItemUseService extends Node +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") + const ArtShopStockType = preload("res://economy/art_shop_stock.gd") const MAX_LEDGER_ENTRIES: int = 64 @@ -128,6 +130,7 @@ func _handle_use_request(peer_id: int, data: Dictionary) -> void: ) if error.is_empty() and ( item == null + or not item.is_available() or ( item.category != ItemData.Category.CONSUMABLE and not is_fish_finder @@ -294,13 +297,16 @@ func submit_local_equipped(item_id: StringName, owns_item: bool) -> void: return _local_equipped_revision += 1 var item: ItemData = _catalog.get_item_by_id(item_id) + var can_equip: bool = ( + item != null and item.is_available() and owns_item + ) var data := { "session_id": _session.get_session_id(), "owner_peer_id": _session.get_local_peer_id(), - "item_id": str(item_id) if item != null and owns_item else "", - "category": int(item.category) if item != null and owns_item else -1, + "item_id": str(item_id) if can_equip else "", + "category": int(item.category) if can_equip else -1, "revision": _local_equipped_revision, - "owns_item": owns_item and item != null, + "owns_item": can_equip, } if _session.is_host(): _handle_equipped_state(_session.get_local_peer_id(), data) @@ -331,6 +337,7 @@ func _handle_equipped_state(peer_id: int, data: Dictionary) -> void: var item: ItemData = _catalog.get_item_by_id(item_id) if not item_id.is_empty() and ( item == null + or not item.is_available() or not bool(data["owns_item"]) or int(item.category) != int(data["category"]) ): @@ -353,8 +360,17 @@ func _apply_equipped(data: Dictionary) -> void: if avatar != null: var item_id := StringName(str(data["item_id"])) var item: ItemData = _catalog.get_item_by_id(item_id) - avatar.set_active_item_is_rod( - int(data["category"]) == ItemData.Category.ROD, + avatar.set_active_fishing_rod( + ( + item as FishingRodDataType + if ( + item != null + and item.is_available() + and int(data["category"]) == ItemData.Category.ROD + and bool(data["owns_item"]) + ) + else null + ), true, ) avatar.set_active_art_kit( diff --git a/network/network_session.gd b/network/network_session.gd index d12e113..076acc5 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -34,7 +34,7 @@ signal server_trust_required( ) signal peer_identity_observed(peer_id: int, status: String) signal operator_status_changed(peer_id: int, is_operator: bool) -signal server_lost +signal server_lost(message: String) signal remote_recovery_requested(peer_id: int, entry_position: Vector3) signal remote_recovery_presentation_changed( peer_id: int, @@ -875,7 +875,7 @@ func _on_server_disconnected() -> void: ) _moderation_disconnect_message = "" _set_state(State.SERVER_LOST, message) - server_lost.emit() + server_lost.emit(message) connection_error.emit(message) @@ -1108,7 +1108,6 @@ func submit_client_identity_proof(data: Dictionary) -> void: @rpc("authority", "call_remote", "reliable", 0) func receive_moderation_disconnect(message: String) -> void: _moderation_disconnect_message = message.left(120) - connection_error.emit(_moderation_disconnect_message) @rpc("authority", "call_remote", "reliable", 0) diff --git a/network/network_shop_service.gd b/network/network_shop_service.gd index 4dd0f98..0f26553 100644 --- a/network/network_shop_service.gd +++ b/network/network_shop_service.gd @@ -5,6 +5,7 @@ const FishingShopStockType = preload( "res://economy/fishing_shop_stock.gd" ) const ItemDataType = preload("res://items/item_data.gd") +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const OwnedItemType = preload("res://items/owned_item.gd") const ArtShopStockType = preload("res://economy/art_shop_stock.gd") @@ -126,6 +127,15 @@ func request_supply(item_id: StringName) -> String: ) +func request_rod(item_id: StringName) -> String: + return _request_purchase( + item_id, + NetworkShopProtocol.ProductCategory.ROD, + 1, + _bag.get_quantity(item_id) if _bag != null else 0, + ) + + func request_reel_speed_upgrade() -> String: return _request_purchase( REEL_PRODUCT_ID, @@ -340,7 +350,7 @@ func _build_authoritative_result( ) if ( item == null - or not item.is_valid() + or not item.is_available() or product_id not in ( FishingShopStockType.get_stock_item_ids() ) @@ -384,7 +394,29 @@ func _build_authoritative_result( rejection = "Purchase could not be completed." resulting_state = current_state + quantity NetworkShopProtocol.ProductCategory.ROD: - rejection = "This item is not sold here." + var rod := ( + _item_catalog.get_item_by_id(product_id) + as FishingRodDataType + if _item_catalog != null else null + ) + var available_rods: Array[FishingRodDataType] = ( + FishingShopStockType.get_rod_stock(_item_catalog) + ) + if ( + rod == null + or not rod.is_shop_available() + or rod not in available_rods + or quantity != 1 + or current_state != 0 + ): + rejection = ( + "Rod already owned." + if current_state > 0 + else "Purchase could not be completed." + ) + else: + cost = rod.shop_price + resulting_state = 1 NetworkShopProtocol.ProductCategory.REEL_SPEED_UPGRADE: if ( product_id != REEL_PRODUCT_ID @@ -434,7 +466,7 @@ func _build_authoritative_result( if ( product_id != ArtShopStockType.ART_KIT_ITEM_ID or art_item == null - or not art_item.is_valid() + or not art_item.is_available() or art_item.category != ItemDataType.Category.TOOL or art_item.stackable or not art_item.equippable @@ -643,6 +675,7 @@ func _validate_local_result(data: Dictionary) -> String: var bait_unlocked: bool = _bag.is_bait_unlocked(product_id) if ( item == null + or not item.is_available() or _bag.get_quantity(product_id) != expected_state or int(data["quantity"]) != FishingShopStockType.get_purchase_quantity( product_id, expected_state, item.max_stack @@ -655,6 +688,22 @@ func _validate_local_result(data: Dictionary) -> String: return "Purchase could not be completed." if not _bag.can_add_item(product_id, data["quantity"]): return "Your Bag is full." + NetworkShopProtocol.ProductCategory.ROD: + var rod := ( + _item_catalog.get_item_by_id(product_id) + as FishingRodDataType + if _item_catalog != null else null + ) + if ( + rod == null + or not rod.is_shop_available() + or _bag.get_quantity(product_id) != expected_state + or expected_state != 0 + or int(data["quantity"]) != 1 + or cost != rod.shop_price + or not _bag.can_add_item(product_id, 1) + ): + return "Purchase could not be completed." NetworkShopProtocol.ProductCategory.REEL_SPEED_UPGRADE: if _upgrades.get_reel_speed_level() != expected_state: return "Purchase could not be completed." @@ -671,8 +720,14 @@ func _validate_local_result(data: Dictionary) -> String: if _cooler_capacity.get_next_cost() != cost: return "Purchase could not be completed." NetworkShopProtocol.ProductCategory.ART_KIT: + var art_item: ItemDataType = ( + _item_catalog.get_item_by_id(product_id) + if _item_catalog != null else null + ) if ( product_id != ArtShopStockType.ART_KIT_ITEM_ID + or art_item == null + or not art_item.is_available() or _bag.get_quantity(product_id) != expected_state or not _bag.can_add_item(product_id, 1) or cost != ArtShopStockType.ART_KIT_PRICE @@ -702,6 +757,11 @@ func _apply_local_product(data: Dictionary) -> bool: _wallet.debit(data["total_cost"]) and _bag.add_item(product_id, data["quantity"]) ) + NetworkShopProtocol.ProductCategory.ROD: + return ( + _wallet.debit(int(data["total_cost"])) + and _bag.add_item(product_id, 1) + ) NetworkShopProtocol.ProductCategory.REEL_SPEED_UPGRADE: return _upgrades.purchase_reel_speed(_wallet) NetworkShopProtocol.ProductCategory.BARRIER_POWER_UPGRADE: diff --git a/player/fishing_rod_attachment.tscn b/player/fishing_rod_attachment.tscn index 46da419..f284825 100644 --- a/player/fishing_rod_attachment.tscn +++ b/player/fishing_rod_attachment.tscn @@ -14,10 +14,12 @@ bone_name = "rod_socket" [node name="FishingRod" type="Node3D" parent="."] -[node name="RodMesh" type="MeshInstance3D" parent="FishingRod"] +[node name="FallbackRodMesh" type="MeshInstance3D" parent="FishingRod"] position = Vector3(0, 0.5, 0) mesh = SubResource("FishingRodMesh") material_override = SubResource("FishingRodMaterial") +[node name="ModelMount" type="Node3D" parent="FishingRod"] + [node name="FishingRodTip" type="Marker3D" parent="FishingRod"] position = Vector3(0, 1.1, 0) diff --git a/player/player.gd b/player/player.gd index 6284873..66dde01 100644 --- a/player/player.gd +++ b/player/player.gd @@ -31,6 +31,7 @@ const ControllerMappingManagerType = preload( const FishingRodAttachmentScene = preload( "res://player/fishing_rod_attachment.tscn" ) +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const HeldItemAttachmentScene = preload( "res://player/held_item_attachment.tscn" ) @@ -445,6 +446,10 @@ var _fishing_after_release_pending: bool = false var _retract_animation_completed: bool = true var _fishing_rod: Node3D var _fishing_rod_tip: Marker3D +var _fishing_rod_model_mount: Node3D +var _fishing_rod_fallback_visual: GeometryInstance3D +var _custom_fishing_rod_visual: Node3D +var _active_fishing_rod_id: StringName var _active_item_is_rod: bool = false var _controller_mapping_manager: ControllerMappingManagerType var _sprint_dust_landing_ready: bool = false @@ -577,6 +582,12 @@ func _initialize_fishing_rod() -> void: _fishing_rod_tip = attachment.get_node( "FishingRod/FishingRodTip" ) as Marker3D + _fishing_rod_model_mount = attachment.get_node( + "FishingRod/ModelMount" + ) as Node3D + _fishing_rod_fallback_visual = attachment.get_node( + "FishingRod/FallbackRodMesh" + ) as GeometryInstance3D func _initialize_held_item_attachment() -> void: @@ -1902,6 +1913,45 @@ func get_fishing_rod() -> Node3D: return _fishing_rod +func set_active_fishing_rod( + rod: FishingRodDataType, + animate_transition: bool = false, +) -> void: + _apply_fishing_rod_model(rod) + set_active_item_is_rod(rod != null and rod.is_available(), animate_transition) + + +func _apply_fishing_rod_model(rod: FishingRodDataType) -> void: + var next_id: StringName = rod.item_id if rod != null else StringName() + if next_id == _active_fishing_rod_id: + return + _active_fishing_rod_id = next_id + if _custom_fishing_rod_visual != null: + _custom_fishing_rod_visual.hide() + _custom_fishing_rod_visual.queue_free() + _custom_fishing_rod_visual = null + if _fishing_rod_fallback_visual == null or _fishing_rod_tip == null: + return + _fishing_rod_fallback_visual.show() + _fishing_rod_tip.position = Vector3(0.0, 1.1, 0.0) + if rod == null: + return + _fishing_rod_tip.position = rod.rod_tip_position + if rod.rod_model_scene == null or _fishing_rod_model_mount == null: + return + var instance := rod.rod_model_scene.instantiate() as Node3D + if instance == null: + push_warning( + "Rod %s model root is not Node3D; using fallback." + % rod.item_id + ) + return + _custom_fishing_rod_visual = instance + _fishing_rod_model_mount.add_child(instance) + instance.transform = rod.rod_model_transform + _fishing_rod_fallback_visual.hide() + + func set_active_item_is_rod( active_is_rod: bool, animate_transition: bool = false, diff --git a/tests/economy_regression_validation.gd b/tests/economy_regression_validation.gd index 51ba48d..a0257d0 100644 --- a/tests/economy_regression_validation.gd +++ b/tests/economy_regression_validation.gd @@ -48,7 +48,8 @@ func _run() -> void: as PlayerAssetReservationService ) assert(player != null) - assert(catalog != null and catalog.candidates.size() == 53) + assert(catalog != null and catalog.candidates.size() == 313) + assert(LogbookCatalog.ordered_species(catalog.candidates).size() == 53) assert(sale_service != null) assert(shop_service != null) assert(session != null and session.is_host()) @@ -72,6 +73,7 @@ func _run() -> void: assert(session.set_host_open(false)) await _test_host_shop_purchase(main, player, shop_service) + await _test_host_rod_purchase(player, shop_service) await _test_host_art_shop_purchase(main, player, shop_service) await _test_fishing_shop_sale_ui( main, player, catalog, sale_service, reservations @@ -160,6 +162,8 @@ func _run_multiplayer_client() -> void: shop_service.local_purchase_finished.connect(_on_shop_finished) var catch_ids: Array[StringName] = [] for fish: FishData in catalog.candidates: + if not fish.active: + continue var fish_catch := _make_catch(fish) player.inventory.add_catch(fish_catch) catch_ids.append(fish_catch.catch_id) @@ -260,6 +264,8 @@ func _test_each_species( sale_service: NetworkSaleService, ) -> void: for fish: FishData in catalog.candidates: + if not fish.active: + continue assert(fish != null) var fish_catch := _make_catch(fish) player.inventory.add_catch(fish_catch) @@ -372,6 +378,8 @@ func _test_host_shop_sale( var species_ids: Array[StringName] = [] var expected_payout: int = 0 for fish: FishData in catalog.candidates: + if not fish.active: + continue var fish_catch := _make_catch(fish) player.inventory.add_catch(fish_catch) species_ids.append(fish_catch.catch_id) @@ -528,6 +536,18 @@ func _test_host_art_shop_purchase( assert(not shop_service.is_local_purchase_pending()) +func _test_host_rod_purchase( + player: Player, + shop_service: NetworkShopService, +) -> void: + assert(player.bag.remove_item(&"basic_fishing_rod", 1)) + _shop_result.clear() + assert(not shop_service.request_rod(&"basic_fishing_rod").is_empty()) + assert(not _shop_result.is_empty() and bool(_shop_result[1])) + assert(player.bag.owns_item(&"basic_fishing_rod")) + assert(not shop_service.is_local_purchase_pending()) + + func _test_fishing_shop_sale_ui( main: Node, player: Player, @@ -616,6 +636,27 @@ func _test_fishing_shop_sale_ui( assert(art_supplies_tab != null and art_supplies_tab.text == "Art Supplies") var sell_mode := shop_tabs[5] as Button assert(sell_mode != null and sell_mode.text == "Sell Fish") + var equipment_tab := shop_tabs[3] as Button + assert(equipment_tab != null and equipment_tab.text == "Equipment") + await _activate_pointer_control(equipment_tab, ui_viewport) + await process_frame + var equipment_sections: Array[String] = [] + for child: Node in shop.get_node("%SuppliesList").get_children(): + if child is Label: + equipment_sections.append((child as Label).text) + assert(equipment_sections == ["rods", "equipment"]) + var supplies_list := shop.get_node("%SuppliesList") as VBoxContainer + var rod_carousel := supplies_list.get_node("RodCarousel") as HBoxContainer + assert(rod_carousel != null) + var rod_cards := rod_carousel.get_node("RodScroll/RodCards") as HBoxContainer + assert(rod_cards != null and rod_cards.get_child_count() == 1) + var basic_rod_button := rod_cards.find_child( + "Rod_basic_fishing_rod", true, false + ) as Button + assert(basic_rod_button != null) + assert(basic_rod_button.custom_minimum_size == Vector2(144.0, 144.0)) + assert(basic_rod_button.icon != null and basic_rod_button.disabled) + assert(rod_cards.find_child("Rod_aurora_rod", true, false) == null) await _activate_pointer_control(art_supplies_tab, ui_viewport) await process_frame var stock_sections: Array[String] = [] diff --git a/tests/equipment_catalog_validation.gd b/tests/equipment_catalog_validation.gd new file mode 100644 index 0000000..3e562b4 --- /dev/null +++ b/tests/equipment_catalog_validation.gd @@ -0,0 +1,49 @@ +extends SceneTree + +const FishingShopStockType = preload("res://economy/fishing_shop_stock.gd") +const FishingShopType = preload("res://ui/fishing_shop.gd") +const ItemCatalogType = preload("res://items/item_catalog.gd") +const ItemDataType = preload("res://items/item_data.gd") +const PlayerBagType = preload("res://inventory/player_bag.gd") +const PlayerWalletType = preload("res://economy/player_wallet.gd") + +const ItemCatalogResource: ItemCatalogType = preload( + "res://items/catalog/item_catalog.tres" +) + + +func _initialize() -> void: + var shop := FishingShopType.new() + assert(shop.call("_unlock_status", false) == "locked") + assert(shop.call("_unlock_status", true) == "unlocked") + shop.free() + + var magnet: ItemDataType = ItemCatalogResource.get_available_item_by_id( + &"magnet" + ) + assert(magnet != null) + assert(magnet.category == ItemDataType.Category.TOOL) + assert(magnet.icon == null) + assert(not magnet.usable) + assert(not magnet.equippable) + assert(not magnet.hotbar_allowed) + assert(FishingShopStockType.get_price(&"magnet") == 250) + assert(FishingShopStockType.get_stock_item_ids().has(&"magnet")) + assert(FishingShopStockType.is_permanent_unlock(&"magnet", magnet)) + + var wallet := PlayerWalletType.new() + wallet.current_balance = 250 + var bag := PlayerBagType.new() + bag.setup(ItemCatalogResource) + assert(FishingShopStockType.purchase_one( + &"magnet", wallet, bag, ItemCatalogResource + )) + assert(bag.owns_item(&"magnet")) + assert(wallet.get_balance() == 0) + assert(not FishingShopStockType.purchase_one( + &"magnet", wallet, bag, ItemCatalogResource + )) + bag.free() + wallet.free() + print("Equipment catalog validation: PASS") + quit() diff --git a/tests/equipment_catalog_validation.gd.uid b/tests/equipment_catalog_validation.gd.uid new file mode 100644 index 0000000..b26406d --- /dev/null +++ b/tests/equipment_catalog_validation.gd.uid @@ -0,0 +1 @@ +uid://1f2k3yrth7qn diff --git a/tests/fish_catalog_content_validation.gd b/tests/fish_catalog_content_validation.gd index 6746d70..cc393f6 100644 --- a/tests/fish_catalog_content_validation.gd +++ b/tests/fish_catalog_content_validation.gd @@ -89,6 +89,8 @@ func _run() -> void: func _validate_weight_based_display_scale() -> void: var previous_scale: float = 0.0 for fish: FishDataType in Catalog.candidates: + if not fish.active: + continue assert(fish.is_selectable()) assert(fish.weight_min_lb > 0.0) assert(fish.weight_max_lb <= 1000.0) @@ -119,9 +121,48 @@ func _validate_weight_based_display_scale() -> void: func _validate_catalog_and_pools() -> void: - assert(Catalog.candidates.size() == 53) + assert(Catalog.candidates.size() == 313) assert(PondPool.candidates.size() == 19) assert(OceanPool.candidates.size() == 34) + var active_count: int = 0 + var inactive_count: int = 0 + var catalog_numbers: Dictionary[int, bool] = {} + for fish: FishDataType in Catalog.candidates: + assert(fish != null and not fish.id.is_empty()) + assert(fish.catalog_number > 0) + assert(not fish.collection_group.is_empty()) + assert(not catalog_numbers.has(fish.catalog_number)) + catalog_numbers[fish.catalog_number] = true + assert(not fish.logbook_fact.strip_edges().is_empty()) + if fish.active: + active_count += 1 + assert(fish.is_selectable()) + assert(fish.display_texture != null) + else: + inactive_count += 1 + assert(not fish.is_selectable()) + assert(fish.display_texture == null) + assert(active_count == 53) + assert(inactive_count == 260) + var inactive_fish: FishDataType = Catalog.get_fish_by_id(&"bowfin") + assert(inactive_fish != null and not inactive_fish.active) + var inactive_pool := FishPoolType.new() + inactive_pool.candidates = [inactive_fish] + var inactive_context := FishingContextType.new() + inactive_context.water_type = WaterType.Type.FRESH_WATER + var inactive_collection := CollectionLogType.new() + var inactive_selector := FishSelectorType.new() + inactive_selector.use_deterministic_test_seed = true + inactive_selector.begin_roll() + assert( + inactive_selector.select_fish( + inactive_pool, + inactive_context, + inactive_collection, + ) == null + ) + assert(inactive_selector.create_catch(inactive_fish) == null) + inactive_collection.free() for fish_id: StringName in ORIGINAL_IDS: var original_fish: FishDataType = Catalog.get_fish_by_id(fish_id) assert(original_fish != null) @@ -277,21 +318,33 @@ func _validate_authoritative_water_filter() -> void: stale_fresh_pool_region.location_tags = [&"coast", &"ocean"] var evidence := {"discovered_fish_ids": []} assert( - service.call("_select_authoritative_fish", pond_region, evidence, null) - != null - ) - assert( - service.call("_select_authoritative_fish", ocean_region, evidence, null) + service.call( + "_select_authoritative_fish", pond_region, evidence, null, null + ) != null ) assert( service.call( - "_select_authoritative_fish", stale_salt_pool_region, evidence, null + "_select_authoritative_fish", ocean_region, evidence, null, null + ) + != null + ) + assert( + service.call( + "_select_authoritative_fish", + stale_salt_pool_region, + evidence, + null, + null, ) == null ) assert( service.call( - "_select_authoritative_fish", stale_fresh_pool_region, evidence, null + "_select_authoritative_fish", + stale_fresh_pool_region, + evidence, + null, + null, ) == null ) service.free() @@ -347,11 +400,14 @@ func _validate_catches_and_authoritative_sale() -> void: } sale_service.set("_buyers", sale_buyers) - for index: int in Catalog.candidates.size(): - var fish: FishDataType = Catalog.candidates[index] + var catch_sequence: int = 0 + for fish: FishDataType in Catalog.candidates: + if not fish.active: + continue + catch_sequence += 1 var fish_catch: FishCatch = selector.create_catch(fish) assert(fish_catch != null) - fish_catch.catch_sequence = index + 1 + fish_catch.catch_sequence = catch_sequence assert(fish_catch.fish.display_texture == fish.display_texture) var loaded: FishCatch = FishCatchType.from_save_dict( @@ -385,7 +441,7 @@ func _validate_catches_and_authoritative_sale() -> void: var sale_result: Dictionary = sale_service.call( "_build_authoritative_result", 1, - "catalog_sale_%d" % index, + "catalog_sale_%d" % catch_sequence, [loaded.to_network_dict()], PelicanBuyer, ) diff --git a/tests/job_multiplayer_validation.gd b/tests/job_multiplayer_validation.gd index eaaf7b6..c31d392 100644 --- a/tests/job_multiplayer_validation.gd +++ b/tests/job_multiplayer_validation.gd @@ -23,13 +23,12 @@ func _run() -> void: func _run_host() -> void: var main: Node = await _create_initialized_main() var session := main.get_node("%NetworkSession") as NetworkSession - var save_manager := main.get("_save_manager") as PlayerSaveManager var jobs := main.get_node("%PlayerJobService") as PlayerJobService - assert(session.start_private_host(TEST_PORT)) - assert(save_manager.initialize_new_game()) - main.call("_enter_gameplay") + assert(session.start_dedicated_host(TEST_PORT, 8, "127.0.0.1")) + jobs.begin_progression_session() await process_frame assert(session.set_host_open(true)) + assert(session.is_dedicated_host()) var host_board: Dictionary = jobs.get_host_board_network_data() assert(PlayerJobService.validate_board(host_board)) diff --git a/tests/logbook_runtime_validation.gd b/tests/logbook_runtime_validation.gd index 88227aa..c7fdb26 100644 --- a/tests/logbook_runtime_validation.gd +++ b/tests/logbook_runtime_validation.gd @@ -108,9 +108,11 @@ func _validate_save_round_trip( var player := main.get("_player") as Player var catalog := main.get("fish_catalog") as FishPool assert(catalog != null) - assert(catalog.candidates.size() == 53) + assert(catalog.candidates.size() == 313) + var active_species := LogbookCatalog.ordered_species(catalog.candidates) + assert(active_species.size() == 53) for index: int in 4: - _add_test_catch(player, catalog.candidates[index]) + _add_test_catch(player, active_species[index]) assert(save_manager.save_now()) var no_catches: Array[FishCatch] = [] var no_discoveries: Array[StringName] = [] @@ -119,18 +121,18 @@ func _validate_save_round_trip( assert(save_manager.load_player_data()) assert(player.inventory.get_all_catches().size() == 4) for index: int in 4: - var original_fish: FishData = catalog.candidates[index] + var original_fish: FishData = active_species[index] assert(player.inventory.get_count(original_fish.id) == 1) assert(player.collection_log.has_discovered(original_fish.id)) - for index: int in range(4, catalog.candidates.size()): - _add_test_catch(player, catalog.candidates[index]) + for index: int in range(4, active_species.size()): + _add_test_catch(player, active_species[index]) assert(save_manager.save_now()) assert(player.inventory.replace_all_catches(no_catches, 1)) assert(player.collection_log.replace_discovered_ids(no_discoveries)) assert(save_manager.load_player_data()) assert(player.inventory.get_all_catches().size() == 53) - for fish: FishData in catalog.candidates: + for fish: FishData in active_species: assert(player.inventory.get_count(fish.id) == 1) assert(player.collection_log.has_discovered(fish.id)) for fish_id: StringName in [ diff --git a/tests/logbook_validation.gd b/tests/logbook_validation.gd index 866a34f..bb43d3d 100644 --- a/tests/logbook_validation.gd +++ b/tests/logbook_validation.gd @@ -40,119 +40,27 @@ func _run() -> void: func _validate_catalog() -> void: - var expected_ids: Array[StringName] = [ - &"bluegill", - &"bass", - &"carp", - &"sunfish", - &"catfish_blue", - &"catfish_channel", - &"catfish_flathead", - &"catfish_white", - &"tuna_albacore", - &"tuna_bigeye", - &"tuna_bluefin", - &"tuna_skipjack", - &"tuna_yellowfin", - &"goby_round", - &"salmon_atlantic", - &"salmon_chum", - &"salmon_coho", - &"salmon_pink", - &"salmon_sockeye", - &"anchovy_european", - &"anchovy_northern", - &"chub_european", - &"chub_flame", - &"chub_lake", - &"goldfish", - &"goldfish_bubbleeye", - &"grouper_gulf", - &"grouper_red", - &"mackerel_atlantic", - &"mackerel_cero", - &"mackerel_chub", - &"mackerel_king", - &"mackerel_spanish", - &"marlin_black", - &"marlin_blue", - &"marlin_white", - &"pomfret_black", - &"pomfret_chinese", - &"pomfret_golden", - &"pomfret_white", - &"sailfish", - &"sauger", - &"saugeye", - &"snapper_lane", - &"snapper_mangrove", - &"snapper_mutton", - &"snapper_red", - &"swordfish", - &"trout_cutthroat", - &"trout_golden", - &"trout_rainbow", - &"trout_steelhead", - &"walleye", - ] - assert(LogbookCatalog.CATALOG_ORDER == expected_ids) - for index: int in expected_ids.size(): - var fish := CatalogResource.get_fish_by_id(expected_ids[index]) + assert(CatalogResource.candidates.size() == 313) + var ordered := LogbookCatalog.ordered_species(CatalogResource.candidates) + assert(ordered.size() == 53) + var previous_number: int = 0 + var catalog_numbers: Dictionary[int, bool] = {} + for fish: FishDataType in CatalogResource.candidates: assert(fish != null) - assert(not LogbookCatalog.facts_for(fish.id).is_empty()) + assert(fish.catalog_number > 0) + assert(not catalog_numbers.has(fish.catalog_number)) + catalog_numbers[fish.catalog_number] = true + assert(not LogbookCatalog.facts_for(fish).is_empty()) assert( - LogbookCatalog.facts_for(fish.id) - == LogbookCatalog.facts_for(fish.id).to_lower() + LogbookCatalog.facts_for(fish) + == LogbookCatalog.facts_for(fish).to_lower() ) - if LogbookCatalog.FISH_FACTS.has(fish.id): - assert(LogbookCatalog.facts_for(fish.id) != "unknown") - else: - assert(LogbookCatalog.facts_for(fish.id) == "unknown") - var expected_category: WaterType.Type = ( - WaterType.Type.SALT_WATER - if expected_ids[index] in [ - &"bass", - &"sunfish", - &"tuna_albacore", - &"tuna_bigeye", - &"tuna_bluefin", - &"tuna_skipjack", - &"tuna_yellowfin", - &"salmon_atlantic", - &"salmon_chum", - &"salmon_coho", - &"salmon_pink", - &"salmon_sockeye", - &"anchovy_european", - &"anchovy_northern", - &"grouper_gulf", - &"grouper_red", - &"mackerel_atlantic", - &"mackerel_cero", - &"mackerel_chub", - &"mackerel_king", - &"mackerel_spanish", - &"marlin_black", - &"marlin_blue", - &"marlin_white", - &"pomfret_black", - &"pomfret_chinese", - &"pomfret_golden", - &"pomfret_white", - &"sailfish", - &"snapper_lane", - &"snapper_mangrove", - &"snapper_mutton", - &"snapper_red", - &"swordfish", - ] - else WaterType.Type.FRESH_WATER - ) - assert( - LogbookCatalog.category_for(fish) - == expected_category - ) - assert(LogbookCatalog.catalog_number(fish.id) == index + 1) + assert(LogbookCatalog.facts_for(fish) != "unknown") + for fish: FishDataType in ordered: + assert(fish.active) + assert(fish.catalog_number > previous_number) + assert(LogbookCatalog.catalog_number(fish) == fish.catalog_number) + previous_number = fish.catalog_number assert( LogbookCatalog.empty_state(WaterType.Type.SALT_WATER) == "No saltwater catches cataloged yet." @@ -195,7 +103,7 @@ func _validate_page() -> void: if LogbookCatalog.category_for(fish) != category: continue var unknown_key := StringName( - "unknown_%d" % LogbookCatalog.catalog_number(fish.id) + "unknown_%d" % LogbookCatalog.catalog_number(fish) ) var entry := entries.get(unknown_key) as Button assert(entry != null) @@ -251,10 +159,13 @@ func _validate_page() -> void: await create_timer(0.25).timeout var bluegill = CatalogResource.get_fish_by_id(&"bluegill") - page.call("_select_entry", &"unknown_1", StringName()) + var bluegill_unknown := StringName( + "unknown_%d" % bluegill.catalog_number + ) + page.call("_select_entry", bluegill_unknown, StringName()) assert( (page.get("_entry_buttons") as Dictionary) - .get(&"unknown_1") != null + .get(bluegill_unknown) != null ) collection.mark_discovered(&"bluegill") await process_frame @@ -290,9 +201,13 @@ func _validate_page() -> void: assert(_detail_text(page).contains("number owned\n1")) assert(_detail_text(page).contains("number caught\nunknown")) assert(_detail_text(page).contains("body of water\nfresh water")) - assert(_detail_text(page).contains("catalog number\n#001")) + assert( + _detail_text(page).contains( + "catalog number\n#%03d" % bluegill.catalog_number + ) + ) assert(_detail_text(page).contains("fish facts\n")) - assert(_detail_text(page).contains(LogbookCatalog.facts_for(&"bluegill"))) + assert(_detail_text(page).contains(LogbookCatalog.facts_for(bluegill))) _validate_detail_field_fonts(page) _validate_handwritten_numeric_scale(page) var portrait_button := page.get("_detail_portrait_button") as Button @@ -413,7 +328,7 @@ func _validate_handwritten_numeric_scale(page: LogbookPage) -> void: var label := node as Label if label.text == "common": text_value = label - elif label.text == "#001": + elif label.text.begins_with("#"): numeric_value = label assert(text_value != null) assert(numeric_value != null) diff --git a/tests/operator_multiplayer_validation.gd b/tests/operator_multiplayer_validation.gd index 5847aa3..3712fd4 100644 --- a/tests/operator_multiplayer_validation.gd +++ b/tests/operator_multiplayer_validation.gd @@ -88,6 +88,11 @@ func _run_host() -> void: entry.revision, )) assert(not session.is_peer_operator(remote_peer_id)) + await create_timer(2.0).timeout + assert(session.kick_authenticated_peer( + remote_peer_id, + remote_record.identity_fingerprint, + )) var disconnect_deadline: int = Time.get_ticks_msec() + 8000 while ( @@ -173,9 +178,25 @@ func _run_client() -> void: assert(not (tabs.get_child(2) as Button).visible) assert(int(players_page.get("_current_tab")) == 0) service.request_unban.rpc_id(1, SECOND_BANNED_FINGERPRINT) - await create_timer(1.0).timeout + var disconnect_deadline: int = Time.get_ticks_msec() + 10000 + while ( + Time.get_ticks_msec() < disconnect_deadline + and session.state != NetworkSession.State.SERVER_LOST + ): + await process_frame + assert(session.state == NetworkSession.State.SERVER_LOST) + assert(not bool(main.get("_gameplay_started"))) + var game_ui := main.get_node("%GameUI") as GameUI + var title_screen := game_ui.get_title_screen() + assert(title_screen.visible) + assert(not title_screen.is_awaiting_start_input()) + assert((title_screen.get_node("%Center") as Control).visible) + assert((title_screen.get_node("%ButtonCenter") as Control).visible) + assert(not (title_screen.get_node("%JoinGamePage") as Control).visible) + var feedback := title_screen.get_node("%FeedbackLabel") as RichTextLabel + assert(feedback.visible) + assert("removed by the host" in feedback.text.to_lower()) print("Operator multiplayer client validation: PASS") - session.disconnect_session("") main.queue_free() for _frame: int in 4: await process_frame diff --git a/tests/rod_catalog_validation.gd b/tests/rod_catalog_validation.gd new file mode 100644 index 0000000..3b43b3f --- /dev/null +++ b/tests/rod_catalog_validation.gd @@ -0,0 +1,109 @@ +extends SceneTree + +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") +const FishingShopStockType = preload("res://economy/fishing_shop_stock.gd") +const ItemCatalogType = preload("res://items/item_catalog.gd") +const ItemDataType = preload("res://items/item_data.gd") +const OwnedItemType = preload("res://items/owned_item.gd") +const PlayerBagType = preload("res://inventory/player_bag.gd") +const PlayerWalletType = preload("res://economy/player_wallet.gd") + +const ItemCatalogResource: ItemCatalogType = preload( + "res://items/catalog/item_catalog.tres" +) +const RodAttachmentScene = preload( + "res://player/fishing_rod_attachment.tscn" +) + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + _validate_catalog_activation() + _validate_shop_stock() + _validate_inactive_save_compatibility() + _validate_fallback_attachment() + print("Rod catalog validation: PASS") + quit() + + +func _validate_catalog_activation() -> void: + var rods: Array[FishingRodDataType] = [] + for item: ItemDataType in ItemCatalogResource.get_valid_items(): + var rod := item as FishingRodDataType + if rod == null: + continue + rods.append(rod) + assert(rod.is_valid()) + if rod.icon == null: + assert(not rod.active) + assert(rods.size() == 21) + var available_rods: Array[FishingRodDataType] = [] + for rod: FishingRodDataType in rods: + if rod.is_available(): + available_rods.append(rod) + assert(available_rods.size() == 1) + var basic: FishingRodDataType = available_rods.front() + assert(basic.item_id == &"basic_fishing_rod") + assert(basic.icon != null) + assert(basic.rod_model_scene == null) + assert( + ItemCatalogResource.get_available_item_by_id(&"aurora_rod") == null + ) + assert(ItemCatalogResource.get_item_by_id(&"aurora_rod") != null) + + +func _validate_shop_stock() -> void: + var stock: Array[FishingRodDataType] = ( + FishingShopStockType.get_rod_stock(ItemCatalogResource) + ) + assert(stock.size() == 1) + assert(stock.front().item_id == &"basic_fishing_rod") + var wallet := PlayerWalletType.new() + wallet.current_balance = 100 + var bag := PlayerBagType.new() + bag.setup(ItemCatalogResource) + assert( + FishingShopStockType.purchase_one( + &"basic_fishing_rod", + wallet, + bag, + ItemCatalogResource, + ) + ) + assert(bag.owns_item(&"basic_fishing_rod")) + assert(wallet.get_balance() == 100) + assert( + not FishingShopStockType.purchase_one( + &"aurora_rod", + wallet, + bag, + ItemCatalogResource, + ) + ) + bag.free() + wallet.free() + + +func _validate_inactive_save_compatibility() -> void: + var bag := PlayerBagType.new() + bag.setup(ItemCatalogResource) + assert(not bag.can_add_item(&"aurora_rod", 1)) + assert(not bag.add_item(&"aurora_rod", 1)) + var legacy_record := OwnedItemType.new() + legacy_record.item_id = &"aurora_rod" + legacy_record.quantity = 1 + var legacy_items: Array[OwnedItemType] = [legacy_record] + assert(bag.replace_all_items(legacy_items)) + assert(bag.owns_item(&"aurora_rod")) + bag.free() + + +func _validate_fallback_attachment() -> void: + var attachment := RodAttachmentScene.instantiate() + assert(attachment.get_node_or_null("FishingRod/FallbackRodMesh") != null) + assert(attachment.get_node_or_null("FishingRod/ModelMount") != null) + assert(attachment.get_node_or_null("FishingRod/FishingRodTip") != null) + attachment.free() diff --git a/tests/rod_catalog_validation.gd.uid b/tests/rod_catalog_validation.gd.uid new file mode 100644 index 0000000..ae0537e --- /dev/null +++ b/tests/rod_catalog_validation.gd.uid @@ -0,0 +1 @@ +uid://bjbgbahx5iuyy diff --git a/tests/world_time_multiplayer_validation.gd b/tests/world_time_multiplayer_validation.gd index 3d1c025..cebb0eb 100644 --- a/tests/world_time_multiplayer_validation.gd +++ b/tests/world_time_multiplayer_validation.gd @@ -3,7 +3,7 @@ extends SceneTree const MainScene = preload("res://main/main.tscn") const TEST_PORT: int = 17983 const INITIAL_HOST_TIME: float = 19.75 -const UPDATED_HOST_TIME: float = 20.75 +const UPDATED_HOST_TIME: float = WorldTimeService.DUSK_END_HOUR const TIME_TOLERANCE_HOURS: float = 0.05 @@ -61,14 +61,31 @@ func _run_host() -> void: assert(session.peer_supports_capability( remote_peer_id, NetworkProtocol.WORLD_WEATHER_CAPABILITY )) + var remote_record: PeerRegistry.PeerRecord = session.get_peer_record( + remote_peer_id + ) + assert(remote_record != null and remote_record.identity_authenticated) + assert(session.set_peer_operator( + remote_peer_id, + remote_record.identity_fingerprint, + true, + )) assert(world_time.get_phase() == WorldTimeService.Phase.DUSK) - await create_timer(1.0).timeout - world_time.synchronize_time(UPDATED_HOST_TIME) + var command_deadline: int = Time.get_ticks_msec() + 10000 + while ( + Time.get_ticks_msec() < command_deadline + and _wrapped_time_difference( + world_time.get_time_hours(), UPDATED_HOST_TIME + ) > TIME_TOLERANCE_HOURS + ): + await process_frame assert(is_equal_approx( world_time.get_persistent_time_hours(), UPDATED_HOST_TIME )) - assert(chat_ui.call("_handle_chat_command", "/weather foggy")) + var fog_deadline: int = Time.get_ticks_msec() + 10000 + while Time.get_ticks_msec() < fog_deadline and not world_weather.is_foggy(): + await process_frame assert( world_weather.get_persistent_weather() == WorldWeatherService.Weather.FOGGY @@ -153,6 +170,11 @@ func _run_client() -> void: assert(is_equal_approx(clock_panel.position.y, 10.0)) assert(is_equal_approx(weather_icon.position.y, 10.0)) assert(clock_panel.position.y + clock_panel.size.y < chat_panel.position.y) + var operator_deadline: int = Time.get_ticks_msec() + 10000 + while Time.get_ticks_msec() < operator_deadline and not session.is_local_operator(): + await process_frame + assert(session.is_local_operator()) + assert(chat_ui.call("_handle_chat_command", "/time night")) var update_deadline: int = Time.get_ticks_msec() + 10000 while ( @@ -168,6 +190,8 @@ func _run_client() -> void: assert(world_time.get_phase() == WorldTimeService.Phase.NIGHT) assert(is_equal_approx(world_time.get_persistent_time_hours(), 15.25)) assert(clock_label.text == world_time.get_clock_text()) + await create_timer(0.6).timeout + assert(chat_ui.call("_handle_chat_command", "/weather foggy")) var fog_deadline: int = Time.get_ticks_msec() + 8000 while ( Time.get_ticks_msec() < fog_deadline diff --git a/ui/chat_ui.gd b/ui/chat_ui.gd index bf38a75..c080a04 100644 --- a/ui/chat_ui.gd +++ b/ui/chat_ui.gd @@ -181,6 +181,7 @@ func setup( _service.local_message_confirmed.connect(_on_local_message_confirmed) _service.history_replaced.connect(_on_history) _service.send_rejected.connect(_on_rejected) + _service.world_command_finished.connect(_on_world_command_finished) _session.peer_removed.connect(_on_peer_removed) _entry.text = _settings.current_settings.chat_draft _entry.caret_column = _entry.text.length() @@ -789,34 +790,16 @@ func _handle_time_command(parts: PackedStringArray) -> void: if parts.size() != 2: _set_status("Usage: /time [dawn, day, dusk, night]") return - if _session == null or not _session.is_host(): - _set_status("Only the host can change world time.") - return - if _world_time == null: + if _service == null or _world_time == null: _set_status("World time is unavailable.") return var phase_name := String(parts[1]).to_lower() - var target_hour: float - match phase_name: - "dawn": - target_hour = WorldTimeServiceType.DAWN_START_HOUR - "day": - target_hour = WorldTimeServiceType.DAWN_END_HOUR - "dusk": - target_hour = WorldTimeServiceType.DUSK_START_HOUR - "night": - target_hour = WorldTimeServiceType.DUSK_END_HOUR - _: - _set_status("Usage: /time [dawn, day, dusk, night]") - return - if not _world_time.set_authoritative_time(target_hour): - _set_status("World time could not be changed.") + if phase_name not in ["dawn", "day", "dusk", "night"]: + _set_status("Usage: /time [dawn, day, dusk, night]") + return + if not _service.request_world_time_change(phase_name): + _set_status("Only the host or an operator can change world time.") return - _set_status("") - _service.broadcast_system_message( - "World time set to %s (%s)." - % [phase_name, _world_time.get_clock_text()] - ) close_chat() @@ -824,37 +807,31 @@ func _handle_weather_command(parts: PackedStringArray) -> void: if parts.size() != 2: _set_status("Usage: /weather [clear, cloudy, rainy, foggy]") return - if _session == null or not _session.is_host(): - _set_status("Only the host can change world weather.") - return - if _world_weather == null: + if _service == null or _world_weather == null: _set_status("World weather is unavailable.") return var weather_name := String(parts[1]).to_lower() - var target_weather: WorldWeatherServiceType.Weather match weather_name: "clear", "sunny": - target_weather = WorldWeatherServiceType.Weather.SUNNY weather_name = "clear" - "cloudy": - target_weather = WorldWeatherServiceType.Weather.CLOUDY - "rainy": - target_weather = WorldWeatherServiceType.Weather.RAINY - "foggy": - target_weather = WorldWeatherServiceType.Weather.FOGGY + "cloudy", "rainy", "foggy": + pass _: _set_status("Usage: /weather [clear, cloudy, rainy, foggy]") return - if not _world_weather.set_authoritative_weather(target_weather): - _set_status("World weather could not be changed.") + if not _service.request_world_weather_change(weather_name): + _set_status("Only the host or an operator can change world weather.") return - _set_status("") - _service.broadcast_system_message( - "World weather set to %s." % weather_name - ) close_chat() +func _on_world_command_finished(success: bool, message: String) -> void: + if success: + _set_status("") + elif not message.is_empty(): + _set_status(message) + + func _on_local_message_confirmed(message: Dictionary) -> void: if ( not _send_pending diff --git a/ui/components/bubble_hotbar/bubble_hotbar_slot.gd b/ui/components/bubble_hotbar/bubble_hotbar_slot.gd index 4bebdfe..6c9764a 100644 --- a/ui/components/bubble_hotbar/bubble_hotbar_slot.gd +++ b/ui/components/bubble_hotbar/bubble_hotbar_slot.gd @@ -377,7 +377,7 @@ func _can_drop_data(_at_position: Vector2, data: Variant) -> bool: if _bag == null or not _bag.owns_item(item_id) or _catalog == null: return false var item: ItemDataType = _catalog.get_item_by_id(item_id) - return item != null and item.is_valid() and item.hotbar_allowed + return item != null and item.is_available() and item.hotbar_allowed if kind == "cooler_fish": var catch_id: StringName = StringName(str(payload.get("catch_id", ""))) return ( diff --git a/ui/fishing_shop.gd b/ui/fishing_shop.gd index d8678b7..ff1a44e 100644 --- a/ui/fishing_shop.gd +++ b/ui/fishing_shop.gd @@ -8,6 +8,7 @@ const PlayerWalletType = preload("res://economy/player_wallet.gd") const FishingShopStockType = preload("res://economy/fishing_shop_stock.gd") const ItemCatalogType = preload("res://items/item_catalog.gd") const ItemDataType = preload("res://items/item_data.gd") +const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const PlayerBagType = preload("res://inventory/player_bag.gd") const FishingSpotType = preload("res://fishing/fishing_spot.gd") const PlayerFishingUpgradesType = preload( @@ -82,6 +83,15 @@ const SUPPLY_PRICE_HEIGHT: float = 24.0 const SUPPLY_PRICE_HORIZONTAL_PADDING: float = 12.0 const SUPPLY_PRICE_ICON_SIZE: float = 18.0 const SUPPLY_PRICE_ICON_GAP: float = 3.0 +const ROD_CARD_TILE_SIZE := Vector2(144.0, 144.0) +const ROD_CARD_HOST_SIZE := Vector2(152.0, 198.0) +const ROD_CAROUSEL_HEIGHT: float = 206.0 +const ROD_CAROUSEL_SEPARATION: int = 12 +const ROD_CAROUSEL_STEP: float = 328.0 +const ROD_PRICE_Y: float = 128.0 +const ROD_PRICE_HEIGHT: float = 30.0 +const ROD_PRICE_FONT_SIZE: int = 18 +const ROD_PRICE_ICON_SIZE: float = 22.0 @onready var _wallet_label: Label = %WalletLabel @onready var _shop_panel: PanelContainer = %ShopPanel @@ -650,7 +660,12 @@ func _refresh_supplies() -> void: stock_item_ids = grouped_item_ids var current_stock_group: StringName = StringName() var current_stock_grid: GridContainer - if _shop_section in [ShopSection.SNACKS, ShopSection.EQUIPMENT]: + if _shop_section == ShopSection.SNACKS: + current_stock_grid = _add_stock_icon_grid() + elif _shop_section == ShopSection.EQUIPMENT: + _add_stock_section("rods") + _add_rod_carousel() + _add_stock_section("equipment") current_stock_grid = _add_stock_icon_grid() for item_id: StringName in stock_item_ids: var item: ItemDataType = _item_catalog.get_item_by_id(item_id) @@ -671,6 +686,10 @@ func _refresh_supplies() -> void: button.alignment = HORIZONTAL_ALIGNMENT_LEFT var owned: int = _bag.get_quantity(item_id) var bait_topoff: bool = FishingShopStockType.is_bait_topoff(item_id) + var permanent_unlock: bool = ( + FishingShopStockType.is_permanent_unlock(item_id, item) + ) + var unlock_status: String = _unlock_status(owned > 0) var bait_unlocked: bool = ( not bait_topoff or _bag.is_bait_unlocked(item_id) ) @@ -683,10 +702,11 @@ func _refresh_supplies() -> void: var use_icon_tile: bool = ( current_stock_grid != null ) - button.text = "%s\nowned %d" % [ - item.display_name, - owned, - ] + button.text = ( + "%s\n%s" % [item.display_name, unlock_status] + if permanent_unlock + else "%s\nowned %d" % [item.display_name, owned] + ) var item_tooltip_text: String = item.description if bait_topoff: if use_icon_tile: @@ -724,11 +744,19 @@ func _refresh_supplies() -> void: button.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN button.alignment = HORIZONTAL_ALIGNMENT_CENTER button.text = "" - item_tooltip_text = "%s\nowned %d\n%s" % [ - item.display_name, - owned, - item.description, - ] + item_tooltip_text = ( + "%s\n%s\n%s" % [ + item.display_name, + unlock_status, + item.description, + ] + if permanent_unlock + else "%s\nowned %d\n%s" % [ + item.display_name, + owned, + item.description, + ] + ) button.disabled = ( _transaction_in_progress or _closing @@ -777,6 +805,8 @@ func _refresh_supplies() -> void: func _item_belongs_in_current_section(item: ItemDataType) -> bool: + if not item.is_available(): + return false match _shop_section: ShopSection.BAIT: return item.is_bait() or item.is_lure() @@ -787,6 +817,10 @@ func _item_belongs_in_current_section(item: ItemDataType) -> bool: return false +func _unlock_status(unlocked: bool) -> String: + return "unlocked" if unlocked else "locked" + + func _add_stock_section(title: String) -> void: var label := Label.new() label.text = title @@ -811,21 +845,156 @@ func _add_stock_icon_grid() -> GridContainer: return grid +func _add_rod_carousel() -> void: + var shell := HBoxContainer.new() + shell.name = "RodCarousel" + shell.custom_minimum_size.y = ROD_CAROUSEL_HEIGHT + shell.size_flags_horizontal = Control.SIZE_EXPAND_FILL + shell.alignment = BoxContainer.ALIGNMENT_CENTER + shell.add_theme_constant_override("separation", 8) + _supplies_list.add_child(shell) + var previous := Button.new() + previous.name = "PreviousRod" + previous.text = "‹" + previous.tooltip_text = "Previous rods" + previous.custom_minimum_size = Vector2(42.0, 72.0) + previous.focus_mode = Control.FOCUS_ALL + UtilityPageStyleType.apply_ocean_button(previous) + shell.add_child(previous) + var scroll := ScrollContainer.new() + scroll.name = "RodScroll" + scroll.custom_minimum_size.y = ROD_CAROUSEL_HEIGHT + scroll.size_flags_horizontal = Control.SIZE_EXPAND_FILL + scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_AUTO + scroll.vertical_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED + scroll.follow_focus = true + shell.add_child(scroll) + var row := HBoxContainer.new() + row.name = "RodCards" + row.size_flags_horizontal = Control.SIZE_EXPAND_FILL + row.add_theme_constant_override( + "separation", ROD_CAROUSEL_SEPARATION + ) + scroll.add_child(row) + var rods: Array[FishingRodDataType] = ( + FishingShopStockType.get_rod_stock(_item_catalog) + ) + for rod: FishingRodDataType in rods: + _add_rod_card(row, rod) + var next := Button.new() + next.name = "NextRod" + next.text = "›" + next.tooltip_text = "Next rods" + next.custom_minimum_size = Vector2(42.0, 72.0) + next.focus_mode = Control.FOCUS_ALL + UtilityPageStyleType.apply_ocean_button(next) + shell.add_child(next) + previous.disabled = rods.size() <= 1 + next.disabled = rods.size() <= 1 + previous.pressed.connect( + _scroll_rod_carousel.bind(scroll, -ROD_CAROUSEL_STEP) + ) + next.pressed.connect( + _scroll_rod_carousel.bind(scroll, ROD_CAROUSEL_STEP) + ) + + +func _add_rod_card(parent: HBoxContainer, rod: FishingRodDataType) -> void: + var owned: bool = _bag.owns_item(rod.item_id) + var level: int = _player.experience.get_level() + var level_locked: bool = level < rod.unlock_level + var tooltip := "%s\n%s" % [rod.display_name, rod.description] + if not rod.effect_summary.strip_edges().is_empty(): + tooltip += "\n%s" % rod.effect_summary + if not rod.tradeoff.strip_edges().is_empty(): + tooltip += "\ntradeoff: %s" % rod.tradeoff + tooltip += "\nlevel %d" % rod.unlock_level + tooltip += "\n%s" % _unlock_status(owned) + var button := _make_stock_button("", tooltip) + button.name = "Rod_%s" % str(rod.item_id) + button.custom_minimum_size = ROD_CARD_TILE_SIZE + button.size = ROD_CARD_TILE_SIZE + button.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN + button.icon = rod.icon + button.expand_icon = true + button.alignment = HORIZONTAL_ALIGNMENT_CENTER + button.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + button.disabled = ( + owned + or level_locked + or _transaction_in_progress + or _closing + or _network_shop == null + or not _network_shop.can_request_purchase() + or not _wallet.can_afford(rod.shop_price) + or not _bag.can_add_item(rod.item_id, 1) + ) + button.pressed.connect(_purchase_rod.bind(rod.item_id)) + var host: Control = _add_supply_icon_tile( + parent, + button, + rod.shop_price, + ROD_CARD_TILE_SIZE, + ROD_CARD_HOST_SIZE, + ROD_PRICE_Y, + ROD_PRICE_HEIGHT, + ROD_PRICE_FONT_SIZE, + ROD_PRICE_ICON_SIZE, + ) + var name_label := Label.new() + name_label.name = "RodName" + name_label.position = Vector2(0.0, 162.0) + name_label.size = Vector2(ROD_CARD_HOST_SIZE.x, 30.0) + name_label.mouse_filter = Control.MOUSE_FILTER_IGNORE + name_label.text = rod.display_name + name_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + name_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + name_label.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS + name_label.add_theme_font_override("font", UtilityPageStyleType.TuffyFont) + name_label.add_theme_font_size_override("font_size", 17) + name_label.add_theme_color_override( + "font_color", UtilityPageStyleType.OCEAN_TEXT_PRIMARY + ) + host.add_child(name_label) + + +func _scroll_rod_carousel(scroll: ScrollContainer, amount: float) -> void: + var target: float = clampf( + float(scroll.scroll_horizontal) + amount, + 0.0, + maxf( + scroll.get_h_scroll_bar().max_value + - scroll.get_h_scroll_bar().page, + 0.0, + ), + ) + var tween := create_tween() + tween.set_trans(Tween.TRANS_QUAD) + tween.set_ease(Tween.EASE_OUT) + tween.tween_method( + func(value: float) -> void: + scroll.scroll_horizontal = roundi(value), + float(scroll.scroll_horizontal), + target, + 0.15, + ) + + func _add_art_kit_button(parent: GridContainer) -> void: var item: ItemDataType = _item_catalog.get_item_by_id( ArtShopStockType.ART_KIT_ITEM_ID ) - if item == null: + if item == null or not item.is_available(): return var owned: bool = _bag.get_quantity(ArtShopStockType.ART_KIT_ITEM_ID) > 0 var button: Button = _make_stock_button( "%s\n%s" % [ item.display_name, - "owned" if owned else "not owned", + _unlock_status(owned), ], "%s\n%s\n%s" % [ item.display_name, - "owned" if owned else "not owned", + _unlock_status(owned), item.description, ], ) @@ -942,29 +1111,35 @@ func _configure_marker_icon_tile( func _add_supply_icon_tile( - parent: GridContainer, + parent: Container, button: Button, price: int, -) -> void: + tile_size: Vector2 = SUPPLY_ICON_TILE_SIZE, + host_size: Vector2 = SUPPLY_ICON_HOST_SIZE, + price_y: float = SUPPLY_PRICE_Y, + price_height: float = SUPPLY_PRICE_HEIGHT, + price_font_size: int = SUPPLY_PRICE_FONT_SIZE, + price_icon_size: float = SUPPLY_PRICE_ICON_SIZE, +) -> Control: var tile_host := Control.new() - tile_host.custom_minimum_size = SUPPLY_ICON_HOST_SIZE + tile_host.custom_minimum_size = host_size tile_host.mouse_filter = Control.MOUSE_FILTER_IGNORE parent.add_child(tile_host) button.position = Vector2.ZERO - button.size = SUPPLY_ICON_TILE_SIZE + button.size = tile_size tile_host.add_child(button) var price_text := str(price) var price_text_width: float = UtilityPageStyleType.TuffyFont.get_string_size( price_text, HORIZONTAL_ALIGNMENT_LEFT, -1.0, - SUPPLY_PRICE_FONT_SIZE, + price_font_size, ).x var price_width: float = minf( - SUPPLY_ICON_TILE_SIZE.x, + tile_size.x, ceilf( price_text_width - + SUPPLY_PRICE_ICON_SIZE + + price_icon_size + SUPPLY_PRICE_ICON_GAP + SUPPLY_PRICE_HORIZONTAL_PADDING ), @@ -972,10 +1147,10 @@ func _add_supply_icon_tile( var price_bubble := PanelContainer.new() price_bubble.name = "PriceBubble" price_bubble.position = Vector2( - (SUPPLY_ICON_TILE_SIZE.x - price_width) * 0.5, - SUPPLY_PRICE_Y, + (tile_size.x - price_width) * 0.5, + price_y, ) - price_bubble.size = Vector2(price_width, SUPPLY_PRICE_HEIGHT) + price_bubble.size = Vector2(price_width, price_height) price_bubble.mouse_filter = Control.MOUSE_FILTER_IGNORE price_bubble.z_index = 2 var price_style := UtilityPageStyleType.rounded_style( @@ -998,7 +1173,7 @@ func _add_supply_icon_tile( price_bubble.add_child(price_row) var price_icon := TextureRect.new() price_icon.name = "CurrencyIcon" - price_icon.custom_minimum_size = Vector2.ONE * SUPPLY_PRICE_ICON_SIZE + price_icon.custom_minimum_size = Vector2.ONE * price_icon_size price_icon.mouse_filter = Control.MOUSE_FILTER_IGNORE price_icon.texture = CURRENCY_ICON price_icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE @@ -1015,13 +1190,14 @@ func _add_supply_icon_tile( "font", UtilityPageStyleType.TuffyFont ) price_label.add_theme_font_size_override( - "font_size", SUPPLY_PRICE_FONT_SIZE + "font_size", price_font_size ) price_label.add_theme_color_override( "font_color", SUPPLY_PRICE_COLOR ) price_label.add_theme_constant_override("outline_size", 0) price_row.add_child(price_label) + return tile_host func _refresh_cooler_capacity() -> void: @@ -1073,7 +1249,7 @@ func _purchase_supply(item_id: StringName) -> void: return var owned: int = _bag.get_quantity(item_id) var item: ItemDataType = _item_catalog.get_item_by_id(item_id) - if item == null: + if item == null or not item.is_available(): _set_feedback("Purchase could not be completed.") return var quantity: int = FishingShopStockType.get_purchase_quantity( @@ -1094,6 +1270,23 @@ func _purchase_supply(item_id: StringName) -> void: _network_shop.request_supply(item_id) +func _purchase_rod(item_id: StringName) -> void: + if _network_shop == null or not _is_transaction_context_valid(): + _set_feedback("Purchase could not be completed.") + return + var rod := _item_catalog.get_item_by_id(item_id) as FishingRodDataType + if ( + rod == null + or not rod.is_shop_available() + or _bag.owns_item(item_id) + or not _wallet.can_afford(rod.shop_price) + or not _bag.can_add_item(item_id, 1) + ): + _set_feedback("Purchase could not be completed.") + return + _network_shop.request_rod(item_id) + + func _purchase_art_kit() -> void: if _network_shop == null or not _is_transaction_context_valid(): _set_feedback("Purchase could not be completed.") diff --git a/ui/logbook_catalog.gd b/ui/logbook_catalog.gd index 1ba1a1e..9bff3cc 100644 --- a/ui/logbook_catalog.gd +++ b/ui/logbook_catalog.gd @@ -3,281 +3,6 @@ extends RefCounted const FishDataType = preload("res://fish/fish_data.gd") -# Catalog numbers are a presentation contract. Add future species deliberately; -# filtering and display order must not redefine an existing number. -const CATALOG_ORDER: Array[StringName] = [ - &"bluegill", - &"bass", - &"carp", - &"sunfish", - &"catfish_blue", - &"catfish_channel", - &"catfish_flathead", - &"catfish_white", - &"tuna_albacore", - &"tuna_bigeye", - &"tuna_bluefin", - &"tuna_skipjack", - &"tuna_yellowfin", - &"goby_round", - &"salmon_atlantic", - &"salmon_chum", - &"salmon_coho", - &"salmon_pink", - &"salmon_sockeye", - &"anchovy_european", - &"anchovy_northern", - &"chub_european", - &"chub_flame", - &"chub_lake", - &"goldfish", - &"goldfish_bubbleeye", - &"grouper_gulf", - &"grouper_red", - &"mackerel_atlantic", - &"mackerel_cero", - &"mackerel_chub", - &"mackerel_king", - &"mackerel_spanish", - &"marlin_black", - &"marlin_blue", - &"marlin_white", - &"pomfret_black", - &"pomfret_chinese", - &"pomfret_golden", - &"pomfret_white", - &"sailfish", - &"sauger", - &"saugeye", - &"snapper_lane", - &"snapper_mangrove", - &"snapper_mutton", - &"snapper_red", - &"swordfish", - &"trout_cutthroat", - &"trout_golden", - &"trout_rainbow", - &"trout_steelhead", - &"walleye", -] - -# Short presentation notes are kept here with the catalog contract rather -# than mixed into gameplay balance resources. Add facts deliberately when a -# species joins the catalog. -const FISH_FACTS: Dictionary[StringName, String] = { - &"bluegill": ( - "bluegill fathers sweep shallow bowls into the bottom for nests, " - + "then stand guard. whole neighborhoods of nests can crowd together." - ), - &"bass": ( - "striped bass split their lives between salt and fresh water, " - + "returning upriver to spawn. a long-lived striper may see three decades." - ), - &"carp": ( - "whisker-like barbels help a common carp investigate the bottom. " - + "nosing through sediment can cloud the water and loosen plants." - ), - &"sunfish": ( - "ocean sunfish are built more like enormous swimming heads than " - + "ordinary fish. they visit the surface and turn sideways to warm up." - ), - &"catfish_blue": ( - "a deep fork in the tail inspired the blue catfish's scientific " - + "name. it rests deep by daylight and becomes more active after dark." - ), - &"catfish_channel": ( - "a channel catfish can taste through skin all over its body, " - + "especially near its gills and whiskers. the male watches the eggs." - ), - &"catfish_flathead": ( - "flatheads favor hideouts made by logs, rocks, ledges, and other " - + "underwater structure. as they grow, fish dominate their menu." - ), - &"catfish_white": ( - "white catfish began along the atlantic coast between new york " - + "and florida. people later carried them far beyond that home range." - ), - &"tuna_albacore": ( - "albacore have unusually long pectoral fins. their warm muscles help " - + "them cruise across wide stretches of open ocean." - ), - &"tuna_bigeye": ( - "bigeye tuna make daily trips between deep, cool water and warmer " - + "surface layers. their large eyes suit those dim depths." - ), - &"tuna_bluefin": ( - "bluefin tuna are powerful ocean travelers. heat retained in their " - + "swimming muscles lets them thrive in surprisingly cold seas." - ), - &"tuna_skipjack": ( - "skipjack travel in fast-moving schools and have dark stripes along " - + "their lower sides. they rarely stop swimming." - ), - &"tuna_yellowfin": ( - "yellowfin are named for their bright yellow fins and finlets. large " - + "schools often gather with other open-ocean hunters." - ), - &"goby_round": ( - "round gobies use fused pelvic fins like a suction cup to hold onto " - + "rocks. they are small fish with a famously large appetite." - ), - &"salmon_atlantic": ( - "atlantic salmon can return from the ocean to the river where they " - + "hatched. unlike many salmon, some survive to make the trip again." - ), - &"salmon_chum": ( - "chum salmon travel immense distances and develop striking bars when " - + "they return to fresh water to spawn." - ), - &"salmon_coho": ( - "coho salmon are agile hunters known for powerful leaps. young coho " - + "may spend more than a year growing in streams." - ), - &"salmon_pink": ( - "pink salmon usually follow a strict two-year life cycle. spawning " - + "males develop the hump that inspired their nickname." - ), - &"salmon_sockeye": ( - "sockeye salmon feed heavily on plankton at sea. adults turn vivid red " - + "as they return inland to spawn." - ), - &"anchovy_european": ( - "european anchovies form dense schools and feed by filtering tiny " - + "plankton from coastal water." - ), - &"anchovy_northern": ( - "northern anchovies gather in huge schools along the pacific coast " - + "and filter plankton with their fine gill rakers." - ), - &"chub_european": ( - "european chub are adaptable river fish. adults often patrol " - + "shallows and feed on insects, small fish, and fruit." - ), - &"chub_flame": ( - "flame chubs prefer cool, clear streams. their bright breeding colors " - + "make a small fish easy to spot in spring water." - ), - &"chub_lake": ( - "lake chubs school in cold northern water and use their small mouths " - + "to pick insects and other tiny prey from the current." - ), - &"goldfish": ( - "goldfish can tolerate a surprisingly wide range of conditions. " - + "their wild relatives often live in slow, weedy water." - ), - &"goldfish_bubbleeye": ( - "bubble-eye goldfish have delicate fluid-filled sacs beneath their " - + "eyes, making careful handling especially important." - ), - &"grouper_gulf": ( - "gulf grouper are ambush predators that use a sudden gulp to pull " - + "prey into their cavernous mouths." - ), - &"grouper_red": ( - "red grouper excavate shelters in reef rubble. the hollows they make " - + "can become hiding places for many smaller animals." - ), - &"mackerel_atlantic": ( - "atlantic mackerel travel in fast schools across the north atlantic " - + "and feed on plankton and small schooling fish." - ), - &"mackerel_cero": ( - "cero mackerel are streamlined coastal hunters. sharp teeth help " - + "them slash through schools of smaller fish." - ), - &"mackerel_chub": ( - "chub mackerel school near the surface and follow plankton blooms. " - + "their dark wavy bars help identify them at a glance." - ), - &"mackerel_king": ( - "king mackerel are swift coastal predators. their pointed teeth and " - + "long body are built for sudden bursts of speed." - ), - &"mackerel_spanish": ( - "spanish mackerel hunt in warm coastal waters and often travel in " - + "loose schools while chasing baitfish." - ), - &"marlin_black": ( - "black marlin are powerful billfish that spend much of their lives " - + "in warm open ocean and can make blistering runs." - ), - &"marlin_blue": ( - "blue marlin are highly migratory open-ocean hunters. their long bill " - + "helps them stun prey before turning back to feed." - ), - &"marlin_white": ( - "white marlin favor warm offshore water and use their rounded dorsal " - + "fin and bill to weave through schools of prey." - ), - &"pomfret_black": ( - "black pomfret have a deep, laterally compressed body that lets them " - + "maneuver neatly through open water." - ), - &"pomfret_chinese": ( - "chinese pomfret are silvery schooling fish with a tall, flattened " - + "body and long sickle-shaped fins." - ), - &"pomfret_golden": ( - "golden pomfret are warm-water swimmers whose golden sheen is most " - + "noticeable along the fins and flanks." - ), - &"pomfret_white": ( - "white pomfret gather over coastal grounds and use their compact, " - + "deep bodies to turn quickly while feeding." - ), - &"sailfish": ( - "sailfish raise their enormous dorsal fin while herding baitfish. " - + "they are among the fastest fish in the sea." - ), - &"sauger": ( - "sauger favor turbid rivers and reservoirs. their mottled backs " - + "blend into the dim, shifting light near the bottom." - ), - &"saugeye": ( - "saugeye are a fertile hybrid of sauger and walleye. they combine " - + "traits from both parent species and often grow quickly." - ), - &"snapper_lane": ( - "lane snapper use reef structure for cover and hunt small crustaceans " - + "and fish when the light begins to fade." - ), - &"snapper_mangrove": ( - "mangrove snapper shelter among roots and docks when young, then " - + "move toward reefs as they grow." - ), - &"snapper_mutton": ( - "mutton snapper have canine teeth that help them pick crabs, shrimp, " - + "and other hard-shelled prey from the reef." - ), - &"snapper_red": ( - "red snapper gather around reefs, wrecks, and ledges. their diet " - + "includes small fish, shrimp, and squid." - ), - &"swordfish": ( - "swordfish are fast, wide-ranging predators with a flattened bill. " - + "they can cross deep water and warm surface layers in one day." - ), - &"trout_cutthroat": ( - "cutthroat trout take their name from the red slash beneath the jaw. " - + "many populations rely on cold, well-oxygenated streams." - ), - &"trout_golden": ( - "golden trout evolved in clear, high-elevation california streams. " - + "their bright flanks stand out against rocky alpine water." - ), - &"trout_rainbow": ( - "rainbow trout are adaptable stream hunters. the pink lateral stripe " - + "is especially vivid when the fish is in breeding condition." - ), - &"trout_steelhead": ( - "steelhead are the ocean-going form of rainbow trout. adults can " - + "leave fresh water and later return to spawn." - ), - &"walleye": ( - "walleye have light-sensitive eyes that help them hunt in murky water " - + "and around dusk. their reflective layer gives the eyes a pale glow." - ), -} static func category_for(fish: FishDataType) -> WaterType.Type: if fish == null: @@ -299,24 +24,27 @@ static func empty_state(category: WaterType.Type) -> String: return "No entries available." -static func catalog_number(fish_id: StringName) -> int: - var index: int = CATALOG_ORDER.find(fish_id) - return index + 1 if index >= 0 else 0 +static func catalog_number(fish: FishDataType) -> int: + return fish.catalog_number if fish != null else 0 -static func facts_for(fish_id: StringName) -> String: - return str(FISH_FACTS.get(fish_id, "unknown")) +static func facts_for(fish: FishDataType) -> String: + if fish == null or fish.logbook_fact.strip_edges().is_empty(): + return "unknown" + return fish.logbook_fact static func ordered_species( candidates: Array[FishDataType], ) -> Array[FishDataType]: - var by_id: Dictionary[StringName, FishDataType] = {} - for fish: FishDataType in candidates: - if fish != null and not fish.id.is_empty(): - by_id[fish.id] = fish var ordered: Array[FishDataType] = [] - for fish_id: StringName in CATALOG_ORDER: - if by_id.has(fish_id): - ordered.append(by_id[fish_id]) + for fish: FishDataType in candidates: + if fish != null and fish.active and not fish.id.is_empty(): + ordered.append(fish) + ordered.sort_custom( + func(a: FishDataType, b: FishDataType) -> bool: + if a.catalog_number == b.catalog_number: + return String(a.id) < String(b.id) + return a.catalog_number < b.catalog_number + ) return ordered diff --git a/ui/logbook_page.gd b/ui/logbook_page.gd index ee63797..c579084 100644 --- a/ui/logbook_page.gd +++ b/ui/logbook_page.gd @@ -654,7 +654,7 @@ func _refresh_details(animate: bool) -> void: func _build_known_details(fish: FishDataType) -> void: _clear_details() - var catalog_number: int = LogbookCatalog.catalog_number(fish.id) + var catalog_number: int = LogbookCatalog.catalog_number(fish) var summary_margin := MarginContainer.new() summary_margin.size_flags_horizontal = Control.SIZE_EXPAND_FILL _set_margins(summary_margin, 40, 0, 40, 0) @@ -719,7 +719,7 @@ func _build_known_details(fish: FishDataType) -> void: summary_columns.add_child(facts_column) var facts_heading := _field_label("fish facts", 16) facts_column.add_child(facts_heading) - var facts := _label(LogbookCatalog.facts_for(fish.id), 16) + var facts := _label(LogbookCatalog.facts_for(fish), 16) facts.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART facts.size_flags_horizontal = Control.SIZE_EXPAND_FILL facts_column.add_child(facts) @@ -999,7 +999,7 @@ func _on_inventory_changed() -> void: func _unknown_selection_key(fish: FishDataType) -> StringName: - var number: int = LogbookCatalog.catalog_number(fish.id) + var number: int = LogbookCatalog.catalog_number(fish) return StringName("unknown_%d" % number) diff --git a/ui/player_menu.gd b/ui/player_menu.gd index 7f73acd..6c5d2f2 100644 --- a/ui/player_menu.gd +++ b/ui/player_menu.gd @@ -4334,7 +4334,7 @@ func _refresh_logbook() -> void: var valid_species: Array[FishDataType] = [] if _catalog != null: for fish: FishDataType in _catalog.candidates: - if fish != null and not fish.id.is_empty(): + if fish != null and fish.active and not fish.id.is_empty(): valid_species.append(fish) _logbook_species = valid_species _logbook_empty.visible = valid_species.is_empty() diff --git a/ui/title_screen.gd b/ui/title_screen.gd index 54cfcf7..9e17d3e 100644 --- a/ui/title_screen.gd +++ b/ui/title_screen.gd @@ -276,6 +276,19 @@ func reopen() -> void: _start_entry_prompt_animation() +func reopen_to_menu() -> void: + reopen() + _awaiting_start_input = false + _stop_entry_prompt_animation() + _start_prompt_center.hide() + _presentation_center.show() + _button_center.show() + var bubble_field := get_node_or_null("%BubbleField") as Control + if bubble_field != null: + bubble_field.show() + _set_title_bubbles_interactive(true) + + func open_join_game_page(endpoint: String = "") -> void: _cancel_title_entry_transition() _awaiting_start_input = false