[{"data":1,"prerenderedAt":831},["ShallowReactive",2],{"project-detail-en-fubaobiaoju":3},{"locale":4,"slug":5,"detailPath":6,"renderMode":7,"category":8,"categories":9,"title":10,"summary":11,"roles":12,"period":17,"status":18,"stack":19,"tags":21,"cover":25,"coverImageLayout":26,"coverAspectRatio":27,"links":28,"highlights":37,"featured":41,"order":42,"ogImage":25,"media":43,"page":83,"blocks":553},"en","fubaobiaoju","\u002Fprojects\u002Ffubaobiaoju","blocks","game",[8],"FlappyCow","A dark-humor wuxia parkour game released on Steam — play a rookie courier racing against terrain, stamina, and office politics.",[13,14,15,16],"programmer","gameplay-systems-design","gameplay-design-role","sound-design","2025.10 ~ 2026.07","live",[20],"unity",[22,23,24],"wuxia-parkour","dark-humor","branching-endings","\u002Fproject-media\u002Ffubaobiaoju\u002Fcover.png","full","16 \u002F 9",[29,33],{"label":30,"url":31,"kind":32},"Steam Store","https:\u002F\u002Fstore.steampowered.com\u002Fapp\u002F4227420\u002F_\u002F","store",{"label":34,"url":35,"kind":36},"Bilibili Video","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1iHNd6PEJo","video",[38,39,40],"Wuxia Parkour","Dark Humor","Branching Endings",false,"70",[44,48,52,56,60,64,68,73,78],{"id":45,"kind":46,"src":25,"alt":47,"aspectRatio":27},"cover","image","福报镖局 — key art",{"id":49,"kind":46,"src":50,"alt":51,"aspectRatio":27},"gallery-01","\u002Fproject-media\u002Ffubaobiaoju\u002Fgallery-01.png","福报镖局 — gameplay screenshot 1",{"id":53,"kind":46,"src":54,"alt":55,"aspectRatio":27},"gallery-02","\u002Fproject-media\u002Ffubaobiaoju\u002Fgallery-02.png","福报镖局 — gameplay screenshot 2",{"id":57,"kind":46,"src":58,"alt":59,"aspectRatio":27},"gallery-03","\u002Fproject-media\u002Ffubaobiaoju\u002Fgallery-03.png","福报镖局 — gameplay screenshot 3",{"id":61,"kind":46,"src":62,"alt":63,"aspectRatio":27},"gallery-04","\u002Fproject-media\u002Ffubaobiaoju\u002Fgallery-04.png","福报镖局 — gameplay screenshot 4",{"id":65,"kind":46,"src":66,"alt":67,"aspectRatio":27},"gallery-05","\u002Fproject-media\u002Ffubaobiaoju\u002Fgallery-05.png","福报镖局 — gameplay screenshot 5",{"id":69,"kind":46,"src":70,"alt":71,"aspectRatio":72},"poster-vertical","\u002Fproject-media\u002Ffubaobiaoju\u002Fposter-vertical.png","福报镖局 — vertical promotional poster","5 \u002F 6",{"id":74,"kind":46,"src":75,"alt":76,"aspectRatio":77},"studio-logo","\u002Fproject-media\u002Ffubaobiaoju\u002Fstudio-logo.png","福报镖局 — studio logo","777 \u002F 470",{"id":79,"kind":46,"src":80,"alt":81,"aspectRatio":82},"architecture-diagram","\u002Fproject-media\u002Ffubaobiaoju\u002Farchitecture.svg","福报镖局 — 系统架构图","2 \u002F 1",{"locale":4,"title":10,"summary":11,"roles":84,"period":17,"highlights":85,"links":86,"seo":89,"blocks":91},[13,14,15,16],[38,39,40],[87,88],{"label":30,"url":31,"kind":32},{"label":34,"url":35,"kind":36},{"title":10,"description":90,"image":45},"FlappyCow is a dark-humor wuxia parkour game. Play a rookie courier, master qinggong, manage your qi, and deliver every order on time.\n",[92,108,183,253,388,530,533,546],{"id":93,"type":94,"region":95,"title":96,"items":97},"project-facts","metrics","hero","Project Info",[98,102,105],{"label":99,"value":100,"image":101},"Team Size","6 ~ 10",{"id":74,"kind":46,"src":75,"alt":76,"aspectRatio":77},{"label":103,"value":104},"Platform","PC (Steam)",{"label":106,"value":107},"Tools","Unity, Yarn Spinner",{"id":109,"type":110,"region":111,"title":112,"document":113},"project-description","rich-text","main","Project Description",{"id":114,"title":115,"body":116,"description":170,"extension":176,"meta":177,"navigation":178,"path":179,"seo":180,"stem":181,"__hash__":182},"projectBlocks\u002Fprojects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Foverview.md","Overview",{"type":117,"value":118,"toc":169},"minimark",[119,126,131,134,138,145,151,157,163],[120,121,122],"blockquote",{},[123,124,125],"p",{},"FlappyCow is a dark-humor wuxia parkour game. You play a rookie courier fresh on the job — master qinggong, manage your qi, cross treacherous terrain, and deliver every order to your esteemed customers on time. Every delivery affects your performance review, and every mistake could get you \"optimized\" — between running for your life, chasing that promotion, and saving your aching back, do your best to enjoy the blessings the agency bestows upon you.",[127,128,130],"h3",{"id":129},"game-loop","Game Loop",[123,132,133],{},"Morning dialogue → daytime delivery runs → evening settlement → the next day. Every order affects your performance review, and every mistake might get you \"optimized\".",[127,135,137],{"id":136},"core-features","Core Features",[123,139,140,144],{},[141,142,143],"strong",{},"Side-scrolling deliveries, run for your life"," — control your jumps and dodge obstacles; when your qi runs dry, burn your own health to keep going.",[123,146,147,150],{},[141,148,149],{},"Day shift not enough? Run night deliveries"," — give up rest to take extra orders. No bonus pay, but the agency sees your \"dedication\".",[123,152,153,156],{},[141,154,155],{},"Wuxia agency, corporate blessings"," — performance reviews, last-place elimination, voluntary overtime. The agency never forces you to work hard.",[123,158,159,162],{},[141,160,161],{},"Beyond deliveries, you still have to live"," — train, eat, rest, pay rent, and make trade-offs between limited wages and energy.",[123,164,165,168],{},[141,166,167],{},"Every colleague has a secret"," — meet all kinds of couriers, get pulled into their side stories, and gradually uncover what the agency hides.",{"title":170,"searchDepth":171,"depth":171,"links":172},"",2,[173,175],{"id":129,"depth":174,"text":130},3,{"id":136,"depth":174,"text":137},"md",{},true,"\u002Fprojects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Foverview",{"description":170},"projects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Foverview","_-OPiIF3dfXq6DZUDzHRE78mMiibmEcujgt19qLkpOQ",{"id":184,"type":110,"region":111,"variant":185,"title":186,"document":187},"my-roles","wide","My Roles",{"id":188,"title":189,"body":190,"description":247,"extension":176,"meta":248,"navigation":178,"path":249,"seo":250,"stem":251,"__hash__":252},"projectBlocks\u002Fprojects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Froles.md","Roles",{"type":117,"value":191,"toc":243},[192,199,203,222,226],[123,193,194,195,198],{},"Responsible for the ",[141,196,197],{},"design and development of the progression system, the content database framework, the save system, Steam integration, the audio system, and the dialogue system",".",[127,200,202],{"id":201},"progression-system","Progression System",[204,205,206,210,213,216,219],"ul",{},[207,208,209],"li",{},"Designed the city's functional layout, module unlock order, and progression structure",[207,211,212],{},"Designed module dependencies, resource costs, stat changes, and progression feedback",[207,214,215],{},"Designed interaction flows such as purchase previews, confirmation dialogs, tooltips, and status hints",[207,217,218],{},"Implemented modules including building interaction, home and restaurant, sutra library, letters, promotion tasks, and ranking cycles",[207,220,221],{},"Built the connections between city features and the story, tutorial, daily loop, and promotion reviews",[127,223,225],{"id":224},"frameworks-and-tooling","Frameworks and Tooling",[204,227,228,231,234,237,240],{},[207,229,230],{},"Built a generic ScriptableObject content database framework with Unity Editor table tooling",[207,232,233],{},"Implemented the runtime data management and local save framework",[207,235,236],{},"Integrated Steam launch detection and achievement sync",[207,238,239],{},"Implemented music, SFX, and scene audio management",[207,241,242],{},"Extended the Yarn Spinner dialogue system",{"title":170,"searchDepth":171,"depth":171,"links":244},[245,246],{"id":201,"depth":174,"text":202},{"id":224,"depth":174,"text":225},"Responsible for the design and development of the progression system, the content database framework, the save system, Steam integration, the audio system, and the dialogue system.",{},"\u002Fprojects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Froles",{"description":247},"projects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Froles","t7MM9NbnXyHZPxxRtQnSoK-vbG-PRlTyMDBIElpGs0Q",{"id":254,"type":110,"region":111,"variant":185,"title":255,"document":256},"tech-implementation","Gameplay Systems",{"id":257,"title":258,"body":259,"description":170,"extension":176,"meta":383,"navigation":178,"path":384,"seo":385,"stem":386,"__hash__":387},"projectBlocks\u002Fprojects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Fimplementation.md","Implementation",{"type":117,"value":260,"toc":378},[261,263,266,269,295,298,332,336,359,363],[127,262,202],{"id":201},[123,264,265],{},"Between delivery runs, the player manages daily life in the city: spending limited wages and energy on stat growth, and gradually unlocking new facilities and higher ranks.",[123,267,268],{},"What the progression system includes:",[204,270,271,277,283,289],{},[207,272,273,276],{},[141,274,275],{},"Home & Restaurant"," — rest to recover energy, eat to stay in shape; rent and meals make up daily expenses",[207,278,279,282],{},[141,280,281],{},"Training"," — invest time and money to improve qinggong, qi, and other delivery stats",[207,284,285,288],{},[141,286,287],{},"Sutra Library & Letters"," — read collected lore, receive agency notices and letters from colleagues, and advance side stories",[207,290,291,294],{},[141,292,293],{},"Promotion Tasks & Ranking Reviews"," — complete promotion tasks to climb the ranks and survive last-place elimination reviews",[123,296,297],{},"How progression works:",[204,299,300,303,306,317,323,329],{},[207,301,302],{},"Progression modules depend on each other and unlock in sequence along the growth structure",[207,304,305],{},"Every progression action costs resources and produces stat changes and growth feedback",[207,307,308,312,313,316],{},[309,310,311],"code",{},"GameModule"," and ",[309,314,315],{},"ModuleManager"," manage module states, parent-child dependencies, and batch unlocking, triggering tutorials and auto-saves on unlock",[207,318,319,322],{},[309,320,321],{},"ZCBuilding"," connects building visuals, interaction states, and functional module states",[207,324,325,328],{},[309,326,327],{},"ZCUIManager"," manages city windows, global windows, the window stack, ESC closing, and window routing",[207,330,331],{},"Purchase previews, confirmation dialogs, tooltips, and status hints support every progression decision",[127,333,335],{"id":334},"music-and-sfx-system","Music and SFX System",[204,337,338,344,353,356],{},[207,339,340,343],{},[309,341,342],{},"SoundManager"," manages BGM, SFX, and ambient audio",[207,345,346,312,349,352],{},[309,347,348],{},"SO_SoundAsset",[309,350,351],{},"SoundDatabase"," configure audio assets and their scene bindings",[207,354,355],{},"Supports BGM crossfade, automatic scene-based audio switching, and an SFX object pool",[207,357,358],{},"Includes random variations, random pitch, looping ambient tracks, and independent volume control",[127,360,362],{"id":361},"dialogue-system-extensions","Dialogue System Extensions",[204,364,365,372,375],{},[207,366,367,368,371],{},"Extended ",[141,369,370],{},"Yarn Spinner"," with custom Yarn Commands that call into game systems",[207,373,374],{},"Added a dialogue queue, auto-play, skip, and dialogue history",[207,376,377],{},"Skipping compensates for critical commands inside skipped lines, keeping story, tutorial, and module states consistent",{"title":170,"searchDepth":171,"depth":171,"links":379},[380,381,382],{"id":201,"depth":174,"text":202},{"id":334,"depth":174,"text":335},{"id":361,"depth":174,"text":362},{},"\u002Fprojects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Fimplementation",{"description":170},"projects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Fimplementation","PYz0o33l3txfLyklRrOi5q7quTJFSjqO8KD_D1XvJ6c",{"id":389,"type":110,"region":111,"variant":185,"title":390,"document":391},"frameworks-systems","Frameworks & Systems",{"id":392,"title":393,"body":394,"description":524,"extension":176,"meta":525,"navigation":178,"path":526,"seo":527,"stem":528,"__hash__":529},"projectBlocks\u002Fprojects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Fsystems.md","Systems",{"type":117,"value":395,"toc":519},[396,406,410,445,449,500,504],[123,397,398,399,312,402,405],{},"The project is built with ",[141,400,401],{},"Unity",[141,403,404],{},"C#",", organized around ScriptableObject, Singleton, event-driven architecture, coroutines, and object pooling.",[127,407,409],{"id":408},"content-database-framework","Content Database Framework",[204,411,412,419,430,439],{},[207,413,414,415,418],{},"A generic ",[141,416,417],{},"ScriptableObject"," content database framework manages resources such as tutorials, restaurant content, letters, audio, achievements, and levels",[207,420,421,422,425,426,429],{},"The generic ",[309,423,424],{},"SO_Database\u003CT>"," handles different data types, while ",[309,427,428],{},"SO_BaseAssetInDatabase"," provides a unified asset name, unique ID, and resource reference",[207,431,432,435,436],{},[309,433,434],{},"BaseTableTab\u003CT>"," builds a shared editor table with add, delete, search, paging, edit, and save support, extended with ",[141,437,438],{},"Odin Inspector",[207,440,441,444],{},[309,442,443],{},"RuntimeAssetBase\u003CT>"," separates static configuration from runtime state, linked to the save system by unique ID",[127,446,448],{"id":447},"runtime-data-and-local-saves","Runtime Data and Local Saves",[204,450,451,457,471,480,490],{},[207,452,453,456],{},[309,454,455],{},"SaveManager"," manages save slots, auto-saving, and data recovery",[207,458,459,462,463,466,467,470],{},[309,460,461],{},"ISavable",", ",[309,464,465],{},"SaveableBehaviour",", and ",[309,468,469],{},"SaveableSingleton"," unify the lifecycle of saveable objects",[207,472,473,312,476,479],{},[309,474,475],{},"CaptureState()",[309,477,478],{},"RestoreState()"," separate runtime objects from persisted data",[207,481,482,483,466,486,489],{},"Unique asset IDs, ",[309,484,485],{},"SaveId",[309,487,488],{},"SaveGuid"," keep database assets and runtime state stably linked",[207,491,492,495,496,499],{},[309,493,494],{},"ES3StorageProvider"," wraps ",[141,497,498],{},"Easy Save 3"," with save directory, format compatibility, compression, and encryption options",[127,501,503],{"id":502},"steam-integration","Steam Integration",[204,505,506,513,516],{},[207,507,508,509,512],{},"Built on ",[141,510,511],{},"Steamworks.NET"," to access the Steam achievement API",[207,514,515],{},"A client interface abstracts platform calls, with an achievement queue, batch submission, callback confirmation, and retry on failure",[207,517,518],{},"Achievement sync works when Steam is not running, offline, or reconnecting",{"title":170,"searchDepth":171,"depth":171,"links":520},[521,522,523],{"id":408,"depth":174,"text":409},{"id":447,"depth":174,"text":448},{"id":502,"depth":174,"text":503},"The project is built with Unity and C#, organized around ScriptableObject, Singleton, event-driven architecture, coroutines, and object pooling.",{},"\u002Fprojects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Fsystems",{"description":524},"projects\u002Ffubaobiaoju\u002Fen\u002Fblocks\u002Fsystems","QaoLZNdY-pSFSDju4KCe_Z1zv_9pYt_zKzQW5AlTYbM",{"id":79,"type":46,"region":111,"title":531,"item":532},"System Architecture",{"id":79,"kind":46,"src":80,"alt":81,"aspectRatio":82},{"id":534,"type":535,"region":111,"variant":536,"title":537,"items":538,"stageScale":544,"stageSideGap":545},"project-gallery","gallery","carousel","Project Gallery",[539,540,541,542,543],{"id":49,"kind":46,"src":50,"alt":51,"aspectRatio":27},{"id":53,"kind":46,"src":54,"alt":55,"aspectRatio":27},{"id":57,"kind":46,"src":58,"alt":59,"aspectRatio":27},{"id":61,"kind":46,"src":62,"alt":63,"aspectRatio":27},{"id":65,"kind":46,"src":66,"alt":67,"aspectRatio":27},0.9,40,{"id":547,"type":548,"region":549,"items":550},"outbound-links","links","aside",[551,552],{"label":30,"url":31,"kind":32},{"label":34,"url":35,"kind":36},[554,560,600,642,731,818,820,827],{"id":93,"type":94,"region":95,"title":96,"items":555},[556,558,559],{"label":99,"value":100,"image":557},{"id":74,"kind":46,"src":75,"alt":76,"aspectRatio":77},{"label":103,"value":104},{"label":106,"value":107},{"id":109,"type":110,"region":111,"title":112,"document":561},{"id":114,"title":115,"body":562,"description":170,"extension":176,"meta":598,"navigation":178,"path":179,"seo":599,"stem":181,"__hash__":182},{"type":117,"value":563,"toc":594},[564,568,570,572,574,578,582,586,590],[120,565,566],{},[123,567,125],{},[127,569,130],{"id":129},[123,571,133],{},[127,573,137],{"id":136},[123,575,576,144],{},[141,577,143],{},[123,579,580,150],{},[141,581,149],{},[123,583,584,156],{},[141,585,155],{},[123,587,588,162],{},[141,589,161],{},[123,591,592,168],{},[141,593,167],{},{"title":170,"searchDepth":171,"depth":171,"links":595},[596,597],{"id":129,"depth":174,"text":130},{"id":136,"depth":174,"text":137},{},{"description":170},{"id":184,"type":110,"region":111,"variant":185,"title":186,"document":601},{"id":188,"title":189,"body":602,"description":247,"extension":176,"meta":640,"navigation":178,"path":249,"seo":641,"stem":251,"__hash__":252},{"type":117,"value":603,"toc":636},[604,608,610,622,624],[123,605,194,606,198],{},[141,607,197],{},[127,609,202],{"id":201},[204,611,612,614,616,618,620],{},[207,613,209],{},[207,615,212],{},[207,617,215],{},[207,619,218],{},[207,621,221],{},[127,623,225],{"id":224},[204,625,626,628,630,632,634],{},[207,627,230],{},[207,629,233],{},[207,631,236],{},[207,633,239],{},[207,635,242],{},{"title":170,"searchDepth":171,"depth":171,"links":637},[638,639],{"id":201,"depth":174,"text":202},{"id":224,"depth":174,"text":225},{},{"description":247},{"id":254,"type":110,"region":111,"variant":185,"title":255,"document":643},{"id":257,"title":258,"body":644,"description":170,"extension":176,"meta":729,"navigation":178,"path":384,"seo":730,"stem":386,"__hash__":387},{"type":117,"value":645,"toc":724},[646,648,650,652,670,672,694,696,712,714],[127,647,202],{"id":201},[123,649,265],{},[123,651,268],{},[204,653,654,658,662,666],{},[207,655,656,276],{},[141,657,275],{},[207,659,660,282],{},[141,661,281],{},[207,663,664,288],{},[141,665,287],{},[207,667,668,294],{},[141,669,293],{},[123,671,297],{},[204,673,674,676,678,684,688,692],{},[207,675,302],{},[207,677,305],{},[207,679,680,312,682,316],{},[309,681,311],{},[309,683,315],{},[207,685,686,322],{},[309,687,321],{},[207,689,690,328],{},[309,691,327],{},[207,693,331],{},[127,695,335],{"id":334},[204,697,698,702,708,710],{},[207,699,700,343],{},[309,701,342],{},[207,703,704,312,706,352],{},[309,705,348],{},[309,707,351],{},[207,709,355],{},[207,711,358],{},[127,713,362],{"id":361},[204,715,716,720,722],{},[207,717,367,718,371],{},[141,719,370],{},[207,721,374],{},[207,723,377],{},{"title":170,"searchDepth":171,"depth":171,"links":725},[726,727,728],{"id":201,"depth":174,"text":202},{"id":334,"depth":174,"text":335},{"id":361,"depth":174,"text":362},{},{"description":170},{"id":389,"type":110,"region":111,"variant":185,"title":390,"document":732},{"id":392,"title":393,"body":733,"description":524,"extension":176,"meta":816,"navigation":178,"path":526,"seo":817,"stem":528,"__hash__":529},{"type":117,"value":734,"toc":811},[735,741,743,765,767,799,801],[123,736,398,737,312,739,405],{},[141,738,401],{},[141,740,404],{},[127,742,409],{"id":408},[204,744,745,749,755,761],{},[207,746,414,747,418],{},[141,748,417],{},[207,750,421,751,425,753,429],{},[309,752,424],{},[309,754,428],{},[207,756,757,435,759],{},[309,758,434],{},[141,760,438],{},[207,762,763,444],{},[309,764,443],{},[127,766,448],{"id":447},[204,768,769,773,781,787,793],{},[207,770,771,456],{},[309,772,455],{},[207,774,775,462,777,466,779,470],{},[309,776,461],{},[309,778,465],{},[309,780,469],{},[207,782,783,312,785,479],{},[309,784,475],{},[309,786,478],{},[207,788,482,789,466,791,489],{},[309,790,485],{},[309,792,488],{},[207,794,795,495,797,499],{},[309,796,494],{},[141,798,498],{},[127,800,503],{"id":502},[204,802,803,807,809],{},[207,804,508,805,512],{},[141,806,511],{},[207,808,515],{},[207,810,518],{},{"title":170,"searchDepth":171,"depth":171,"links":812},[813,814,815],{"id":408,"depth":174,"text":409},{"id":447,"depth":174,"text":448},{"id":502,"depth":174,"text":503},{},{"description":524},{"id":79,"type":46,"region":111,"title":531,"item":819},{"id":79,"kind":46,"src":80,"alt":81,"aspectRatio":82},{"id":534,"type":535,"region":111,"variant":536,"title":537,"items":821,"stageScale":544,"stageSideGap":545},[822,823,824,825,826],{"id":49,"kind":46,"src":50,"alt":51,"aspectRatio":27},{"id":53,"kind":46,"src":54,"alt":55,"aspectRatio":27},{"id":57,"kind":46,"src":58,"alt":59,"aspectRatio":27},{"id":61,"kind":46,"src":62,"alt":63,"aspectRatio":27},{"id":65,"kind":46,"src":66,"alt":67,"aspectRatio":27},{"id":547,"type":548,"region":549,"items":828},[829,830],{"label":30,"url":31,"kind":32},{"label":34,"url":35,"kind":36},1786880261048]