{"id":9095,"date":"2026-10-03T23:22:15","date_gmt":"2026-10-03T14:22:15","guid":{"rendered":"https:\/\/nsb.homeip.net\/wp\/?p=9095"},"modified":"2026-10-04T00:37:41","modified_gmt":"2026-10-03T15:37:41","slug":"%e9%9b%bb%e5%ad%90%e8%be%9e%e6%9b%b8brain%e3%82%92%e3%81%84%e3%81%98%e3%82%8b-13-brainux%e3%81%a7%e3%82%b2%e3%83%bc%e3%83%a0%e3%82%92%e6%94%b9%e9%80%a0%e3%81%97%e3%81%a6%e9%81%8a%e3%81%b6-1-balder","status":"publish","type":"post","link":"https:\/\/nsb.homeip.net\/wp\/?p=9095","title":{"rendered":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nsb.homeip.net\/wp\/?p=9095\/#%E2%97%8E%E3%80%80Balder_2D%E3%80%80%E7%84%A1%E9%87%8D%E5%8A%9B%E4%B8%8B%E3%81%AE%E4%BA%8C%E6%AC%A1%E5%85%83%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B2%E3%83%BC%E3%83%A0_%E6%94%B9%E9%80%A0%E7%89%88%E3%81%AA%E3%82%89Trixie%E3%81%A7%E3%82%82%E5%AE%9F%E8%A1%8C%E3%81%AF%E5%8F%AF%E8%83%BD\" >\u25ce\u3000Balder 2D\u3000\u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0  (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd)<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nsb.homeip.net\/wp\/?p=9095\/#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88\" >\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nsb.homeip.net\/wp\/?p=9095\/#%E3%82%B2%E3%83%BC%E3%83%A0%E8%A9%B3%E7%B4%B0\" >\u30b2\u30fc\u30e0\u8a73\u7d30<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nsb.homeip.net\/wp\/?p=9095\/#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%EF%BC%9A%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_%E3%80%80%EF%BC%8B%E3%80%80%E6%94%B9%E9%80%A0\" >\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff1a\u30bd\u30fc\u30b9\u304b\u3089\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u3000\uff0b\u3000\u6539\u9020<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nsb.homeip.net\/wp\/?p=9095\/#%E6%94%B9%E9%80%A0%E3%81%AE%E3%81%8A%E6%99%82%E9%96%93\" >\u6539\u9020\u306e\u304a\u6642\u9593<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E2%97%8E%E3%80%80Balder_2D%E3%80%80%E7%84%A1%E9%87%8D%E5%8A%9B%E4%B8%8B%E3%81%AE%E4%BA%8C%E6%AC%A1%E5%85%83%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B2%E3%83%BC%E3%83%A0_%E6%94%B9%E9%80%A0%E7%89%88%E3%81%AA%E3%82%89Trixie%E3%81%A7%E3%82%82%E5%AE%9F%E8%A1%8C%E3%81%AF%E5%8F%AF%E8%83%BD\"><\/span>\u25ce\u3000Balder 2D\u3000\u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0<br \/> (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88\"><\/span>\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223146_854x480.png\"><img loading=\"lazy\" decoding=\"async\" width=\"854\" height=\"480\" data-id=\"6542\" src=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223146_854x480.png\" alt=\"\" class=\"wp-image-6542\" srcset=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223146_854x480.png 854w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223146_854x480-300x169.png 300w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223146_854x480-768x432.png 768w\" sizes=\"auto, (max-width: 854px) 100vw, 854px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223547_854x480.png\"><img loading=\"lazy\" decoding=\"async\" width=\"854\" height=\"480\" data-id=\"6543\" src=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223547_854x480.png\" alt=\"\" class=\"wp-image-6543\" srcset=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223547_854x480.png 854w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223547_854x480-300x169.png 300w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223547_854x480-768x432.png 768w\" sizes=\"auto, (max-width: 854px) 100vw, 854px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260501-013725_854x480.png\"><img loading=\"lazy\" decoding=\"async\" width=\"854\" height=\"480\" data-id=\"6544\" src=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260501-013725_854x480.png\" alt=\"\" class=\"wp-image-6544\" srcset=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260501-013725_854x480.png 854w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260501-013725_854x480-300x169.png 300w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260501-013725_854x480-768x432.png 768w\" sizes=\"auto, (max-width: 854px) 100vw, 854px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223006_854x480_scrot.png\"><img loading=\"lazy\" decoding=\"async\" width=\"854\" height=\"480\" data-id=\"8814\" src=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223006_854x480_scrot.png\" alt=\"\" class=\"wp-image-8814\" srcset=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223006_854x480_scrot.png 854w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223006_854x480_scrot-300x169.png 300w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223006_854x480_scrot-767x431.png 767w\" sizes=\"auto, (max-width: 854px) 100vw, 854px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223041_854x480_scrot.png\"><img loading=\"lazy\" decoding=\"async\" width=\"854\" height=\"480\" data-id=\"8815\" src=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223041_854x480_scrot.png\" alt=\"\" class=\"wp-image-8815\" srcset=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223041_854x480_scrot.png 854w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223041_854x480_scrot-767x431.png 767w, https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/2026-09-16-223041_854x480_scrot-300x169.png 300w\" sizes=\"auto, (max-width: 854px) 100vw, 854px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%82%B2%E3%83%BC%E3%83%A0%E8%A9%B3%E7%B4%B0\"><\/span>\u30b2\u30fc\u30e0\u8a73\u7d30<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/sourceforge.net\/projects\/balder\">https:\/\/sourceforge.net\/projects\/balder<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8d77\u52d5\uff1acd balder2d\/balder2d-1.0\/bin; .\/balder2d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u25cf\u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0<br \/>\u5c0f\u3055\u306a\u30d7\u30ed\u30fc\u30d6\u3092\u64cd\u308a\u3001\u4ed6\u306e\u30d7\u30ec\u30a4\u30e4\u30fc\u3092\u7834\u58ca\u3057\u307e\u3059\u3002<br \/>\u81ea\u5206\u306f\u7d2b\u306e\u30d7\u30ed\u30fc\u30d6\u3067\u3059\u3002<br \/>\u30d7\u30ed\u30fc\u30d6\u306e\u9032\u3080\u65b9\u5411\u3084\u901f\u5ea6\u306f\u3001\u58c1\u3084\u4ed6\u306e\u30d7\u30ed\u30fc\u30d6\u306b\u3076\u3064\u304b\u3089\u306a\u3044\u9650\u308a\u5909\u5316\u3057\u307e\u305b\u3093\u3002<br \/>\u5f3e\u4e38\u3092\u6483\u3063\u305f\u6642\u3001\u9006\u65b9\u5411\u306e\u5c0f\u3055\u306a\u53cd\u52d5\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\u3010\u64cd\u4f5c\u3011[\u2190]:\u5de6\u56de\u8ee2 [\u2192]:\u53f3\u56de\u8ee2 [\u2191]:\u6483\u3064 [\u2193]:\u58c1\u306b\u304f\u3063\u3064\u304f\/\u96e2\u308c\u308b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u30aa\u30ea\u30b8\u30ca\u30eb\u3067\u306f\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf(Python\u88fdAI)\u3068\u306e\u5bfe\u6226\u304c\u53ef\u80fd\u3067\u3059\u3002<br \/>\u6539\u9020\u7248\u3067\u306f\u3001C++\u306b\u5207\u308a\u66ff\u3048\u3066\u3042\u308a\u307e\u3059\u306e\u3067\u3001Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Brain\u4e0a\u3067\u306e\u5b9f\u884c\u3067\u306f\u3001\u52d5\u4f5c\u306f\u3057\u307e\u3059\u304c\u3001<br \/>800&#215;600\u306e\u753b\u9762\u3092\u60f3\u5b9a\u3055\u308c\u3066\u3044\u308b\u3088\u3046\u3067\u3001\u5168\u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u8868\u793a\u3055\u308c\u307e\u305b\u3093\u3002<br \/>\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u79fb\u52d5\u3057\u3066\u3001\u4e0a\u5074\u304b\u4e0b\u5074\u304c\u8868\u793a\u3055\u308c\u306a\u3044\u72b6\u614b\u3067\u3042\u308c\u3070\u3001\u30d7\u30ec\u30a4\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">AI\u3068\u306e\u5bfe\u6226\u30d7\u30ec\u30a4\u3082\u697d\u3057\u3081\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u305f\u3081\u3001\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3079\u308b\u3088\u3046\u306b\u3057\u3066\u307f\u307e\u3057\u305f\u3002<br \/>\u305d\u306e\u307b\u304b\u7d30\u304b\u3044\u90e8\u5206\u3082\u5909\u66f4\u3067\u304d\u307e\u3059\u306e\u3067\u3001\u30bd\u30fc\u30b9\u3092\u89e3\u6790\u3057\u3066\u307f\u308b\u306e\u3082\u9762\u767d\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Options\u3067\u3001Player\u6570\u3092\u6307\u5b9a\u3067\u304d\u307e\u3059(AI\u3082\u542b\u3081\u305f\u4eba\u6570\u3067\u3059)<br \/>\u4ed6\u306b\u4ee5\u4e0b\u306e\u9805\u76ee\u304c\u5909\u66f4\u3067\u304d\u307e\u3059\u3002<br \/>\u30fbGame Setup\u3000\u3000\u30de\u30c3\u30d7\u306e\u9078\u629e\u3001\u5236\u9650\u6642\u9593\u3001\u6b8b\u6570\u7b49\u304c\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002<br \/>\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000(\u30de\u30c3\u30d7\u306fDefault\u3068\u304b\u304c\u904a\u3073\u3084\u3059\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002)<br \/>\u30fbPlayer Setup\u3000\u3000Human(\u30ad\u30fc\u30d0\u30a4\u30f3\u30c9)\u304bAI(3\u7a2e\u985e\u304b\u3089\u9078\u629e)\u7b49\u30d7\u30ec\u30a4\u30e4\u30fc\u8a2d\u5b9a\u304c\u51fa\u6765\u307e\u3059\u3002<br \/>\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\uff08\u30ad\u30fc\u30d0\u30a4\u30f3\u30c9\u8a2d\u5b9a\u306f\u4e0b\u306e\u307b\u3046\u304c\u8868\u793a\u3055\u308c\u306a\u3044\u306e\u3067\u3001<br \/>\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\uff08\u6539\u9020\u524d\u306b\u8a2d\u5b9a\u3059\u308b\u304b\u3001\uff09<br \/>\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\uff08config.xml\u30d5\u30a1\u30a4\u30eb\u3092\u76f4\u63a5\u3044\u3058\u308a\u307e\u3057\u3087\u3046\u3002\uff09<br \/>\u30fbSound &amp; Video\u3000Fullscreen\/Sound\/Music\u306e\u8a2d\u5b9a\u304c\u3067\u304d\u307e\u3059.<br \/>\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\uff08Fullscreen\u306f\u73fe\u72b6\u30a8\u30e9\u30fc\u306b\u306a\u308a\u307e\u3059\u3002\uff09<br \/>\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\uff08Music\u306f\u901f\u5ea6\u306b\u5f71\u97ff\u3057\u307e\u3059\u306e\u3067\u3001\u7121\u52b9\u63a8\u5968\u3067\u3059\u3002\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b88\u308a\u306b\u5fb9\u3059\u308b\u304b\u3001\u30ea\u30b9\u30af\u3092\u899a\u609f\u3067\u7279\u653b\u3059\u308b\u304b<br \/>\u30b2\u30fc\u30e0\u30b9\u30bf\u30a4\u30eb\u304c\u5206\u304b\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff1a\u6539\u9020\u5f8c\u306b\u30d3\u30eb\u30c9\u3057\u305f\u3082\u306e\u3092<br \/>zip\u3067\u56fa\u3081\u307e\u3057\u305f\u306e\u3067\u3001Brainux\u306b\u5c55\u958b\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044<br \/>\u3053\u3061\u3089\u306fTrixie\u4e0a\u3067\u3082\u5b9f\u884c\u3067\u304d\u308b\u306f\u305a\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/nsb.homeip.net\/Brain\/Upload\/balder2d\/balder2d-bin.zip\">https:\/\/nsb.homeip.net\/Brain\/Upload\/balder2d\/balder2d-bin.zip<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c55\u958b\u5f8c\u3001<br \/>$ cd bin<br \/>$ .\/balder2d<br \/>\u3067\u8d77\u52d5\u3067\u304d\u308b\u306f\u305a\u3067\u3059\u3002<br \/>\uff08<a href=\"https:\/\/nsb.homeip.net\/wp\/?p=5751#libsdl12%E3%82%92trixie%E7%94%A8%E3%81%AB%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E6%8E%A1%E7%94%A8\" target=\"_blank\" rel=\"noopener\">Trixie\u3067\u306fSDL1.2\u306e\u81ea\u30d3\u30eb\u30c9\u306f\u5fc5\u8981\u3067\u3059\u3002<\/a>\uff09<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"Ra34i8XGhp\"><a href=\"https:\/\/nsb.homeip.net\/wp\/?p=5751\">\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (12) Brainux \u6700\u65b0\u7248(Trixie)\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u904a\u3076<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u201c\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (12) Brainux \u6700\u65b0\u7248(Trixie)\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u904a\u3076\u201d \u2014 \u5948\u9162\u7f8e\u306e\u90e8\u5c4b\u3000\u5225\u9928\" src=\"https:\/\/nsb.homeip.net\/wp\/?p=5751&amp;embed=true#?secret=g051NOYsfr#?secret=Ra34i8XGhp\" data-secret=\"Ra34i8XGhp\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">balder2d\u6539\u9020\u7248\u306e\u30bd\u30fc\u30b9\u3092\u542b\u3093\u3060\u3082\u306e\u306f\u4ee5\u4e0b\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/nsb.homeip.net\/Brain\/Upload\/balder2d\/balder2d-kai.zip\">https:\/\/nsb.homeip.net\/Brain\/Upload\/balder2d\/balder2d-kai.zip<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%EF%BC%9A%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_%E3%80%80%EF%BC%8B%E3%80%80%E6%94%B9%E9%80%A0\"><\/span>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff1a\u30bd\u30fc\u30b9\u304b\u3089\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \u3000\uff0b\u3000\u6539\u9020<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">debian11\u306a\u3089\u30d3\u30eb\u30c9\u53ef\u80fd\u3067\u3059\u3002<br \/><br \/>debian13\u3067\u306fpython2\u304c\u524a\u9664\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u30d3\u30eb\u30c9\u4e0d\u53ef\u306b\u306a\u308a\u307e\u3059\u3002<br \/>(AI\u304cpython2\u88fd\u3067\u3059)<br \/>AI\u3092C++\u306b\u79fb\u690d\u3057\u305f\u6539\u9020\u7248\u3067\u3042\u308c\u3070\u3001<br \/>debian13\u3067\u3082\u30d3\u30eb\u30c9\u3057\u305f\u3082\u306e\u306e\u52d5\u4f5c\u306f\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806\u8a73\u7d30(\u30af\u30ea\u30c3\u30af\u3067\u8868\u793a)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cd<br \/>mkdir balder2d<br \/>cd balder2d<br \/><br \/>\u30bd\u30fc\u30b9\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3001\u30d5\u30a9\u30eb\u30c0\u306b\u4fdd\u5b58<br \/><a href=\"https:\/\/sourceforge.net\/projects\/balder\/files\/Balder%202D\/balder2d1.0\/balder2d-1.0.tar.gz\/download\">https:\/\/sourceforge.net\/projects\/balder\/files\/Balder%202D\/balder2d1.0\/balder2d-1.0.tar.gz\/download<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">tar zxvf balder2d-1.0.tar.gz<br \/>cd balder2d-1.0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sudo apt install scons \\<br \/> libsdl1.2-dev libsdl-image1.2-dev libsdl-mixer1.2-dev \\<br \/> libsdl-ttf2.0-dev libboost-all-dev python2-dev<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sudo apt install libguichan-dev<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sudo apt install scons<br \/>scons<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#\u30a8\u30e9\u30fc\u306e\u5bfe\u7b56<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vi SConstruct<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-includepath = [&#39;\/usr\/include\/python2.4&#39;,&#39;include&#39;]\n+includepath = [&#39;\/usr\/include\/python2.7&#39;,&#39;include&#39;]\n\n\n-libs = Split(&#39;guichan_sdl guichan SDL_image SDL_mixer SDL_gfx python2.4 physfs&#39;)\n+libs = Split(&#39;guichan_sdl guichan SDL SDL_image SDL_mixer SDL_gfx python2.7 physfs&#39;)\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi bin\/scripts\/test\/<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-env = Environment(CPPPATH=&#39;\/usr\/include\/python2.4&#39;)\n+env = Environment(CPPPATH=&#39;\/usr\/include\/python2.7&#39;)\n\n-env.Program(&#39;runtests&#39;, &#39;runtests.cpp&#39;, LIBS=&#39;python2.4&#39;)\n+env.Program(&#39;runtests&#39;, &#39;runtests.cpp&#39;, LIBS=&#39;python2.7&#39;)\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">scons -c<br \/>scons<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cd balder2d\/balder2d-1.0\/bin\/; .\/balder2d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u306e\u307e\u307e\u3060\u3068\u3001\u30d7\u30ec\u30a4\u753b\u9762\u306e\u89e3\u50cf\u5ea6\u304c\u5927\u304d\u3059\u304e\u3066\u30b2\u30fc\u30e0\u753b\u9762\u304c\u5168\u90e8\u8868\u793a\u3055\u308c\u306a\u3044\u306e\u3067\u3001<br \/>\u8868\u793a\u7bc4\u56f2\u3092\u8abf\u6574\u3057\u3066\u307f\u307e\u3059\u3002\u3064\u3044\u3067\u306b\u3001SDL\u306e\u30e2\u30fc\u30c9\u309216bit\u5316<br \/>\uff08\u672c\u6765\u306f\u30de\u30c3\u30d7\u30b5\u30a4\u30ba\u304b\u3089\u753b\u9762\u30b5\u30a4\u30ba\u3092\u63b2\u8f09\u3057\u3066\u3044\u308b\u306e\u3067\u3059\u304c\u3001<br \/>\u3000\u5f37\u5236\u7684\u306b\u753b\u9762\u30b5\u30a4\u30ba\u3092\u5909\u3048\u3066\u3044\u308b\u306e\u3067\u3001\u4e0d\u5177\u5408\u304c\u51fa\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/main.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-render-&gt;SetScreen(800,600);\n+render-&gt;SetScreen(850,480);<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/renderer.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-SetScreen(800, 600);\n+SetScreen(850, 480);<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/gamemanager.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code> mapwidth = statbox_x = mp.GetMapWidth();\n+if (mapwidth &gt; 850) mapwidth = statbox_x = 850;\n mapheight = statbox_y = mp.GetMapHeight();\n+if (mapheight+STATHEIGHT &gt; 480){ \n+    mapheight = 480-STATHEIGHT-20;\n+    statbox_y = 480-STATHEIGHT;\n+}\n-render-&gt;SetScreen(mp.GetMapWidth(), mp.GetMapHeight()+STATHEIGHT,\n+render-&gt;SetScreen(tatbox_x, statbox_y+STATHEIGHT,<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/collisionmask.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code> #include &quot;imageloader.h&quot;\n+#include &quot;gamemanager.h&quot;\n\n\n        if (!field) throw &quot;invalid surface used to create collision mask&quot;;\n        width = field-&gt;w;\n        height = field-&gt;h;\n+       if (width &gt; 850) width = 850;\n+       if (height+STATHEIGHT &gt; 480) height= 480-STATHEIGHT-0;<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/menu\/options.cpp\u3000\u3000\u3000#\u3000\uff08Back\u30dc\u30bf\u30f3\u306e\u5834\u6240\u3092\u5909\u66f4\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-page-&gt;add(backButton, page-&gt;getWidth() - (backButton-&gt;getWidth()+50), page-&gt;getHeight() - (50 + backButton-&gt;getHeight()));\n+page-&gt;add(backButton, page-&gt;getWidth() - (backButton-&gt;getWidth()+50), page-&gt;getHeight() - (150 + backButton-&gt;getHeight()));<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/menu\/gamesetup.cpp       #\u3000\uff08Back\u30dc\u30bf\u30f3\u306e\u5834\u6240\u3092\u5909\u66f4\uff08\u5834\u6240\u304c\u306a\u304f\u3066\u4e0d\u683c\u597d\uff09\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-page-&gt;add(backButton, page-&gt;getWidth() - (backButton-&gt;getWidth()+50), page-&gt;getHeight() - (50 + backButton-&gt;getHeight()));\n+page-&gt;add(backButton, page-&gt;getWidth() - (backButton-&gt;getWidth()+0), page-&gt;getHeight() - (150 + backButton-&gt;getHeight()));<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/menu\/playersetup.cpp\u3000\u3000#\u3000\uff08Back\u30dc\u30bf\u30f3\u306e\u5834\u6240\u3092\u5909\u66f4\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-page-&gt;add(backButton, page-&gt;getWidth() - (backButton-&gt;getWidth()+50), page-&gt;getHeight() - (50 + backButton-&gt;getHeight()));\n+page-&gt;add(backButton, page-&gt;getWidth() - (backButton-&gt;getWidth()+50), page-&gt;getHeight() - (150 + backButton-&gt;getHeight()));<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/menu\/soundvideo.cpp\u3000\u3000#\u3000\uff08Back\u30dc\u30bf\u30f3\u306e\u5834\u6240\u3092\u5909\u66f4\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-page-&gt;add(backButton, page-&gt;getWidth() - (backButton-&gt;getWidth()+50), page-&gt;getHeight() - (50 + backButton-&gt;getHeight()));\n+page-&gt;add(backButton, page-&gt;getWidth() - (backButton-&gt;getWidth()+50), page-&gt;getHeight() - (150 + backButton-&gt;getHeight()));<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/gamemanager.cpp #\u30ea\u30b9\u30dd\u30fc\u30f3\u6642\u306e\u30d0\u30b0\u4fee\u6b63()<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>     srand(frame);  \/\/  \u30fb\u30fb\u30fb\u30fb\n\n-           int x = rand()%collision_mask-&gt;GetWidth();\n+           int x = 50 + rand()%(collision_mask-&gt;GetWidth()-100);\n-           int y = rand()%collision_mask-&gt;GetHeight();\n+           int y = 50 + rand()%(collision_mask-&gt;GetHeight()-100);\n            int radius = p-&gt;GetWidth();\n            \/\/ test and make sure this doesn&#39;t burry the probe too deeply in a wall\n            if (collision_mask-&gt;TestPixel(x, y + radius)){collision=true;continue;}\n+           if (collision_mask-&gt;TestPixel(x + radius, y + radius)){collision=true;continue;}\n+           if (collision_mask-&gt;TestPixel(x - radius, y + radius)){collision=true;continue;}\n-           if (collision_mask-&gt;TestPixel(x, x - radius)){collision=true;continue;}\n+           if (collision_mask-&gt;TestPixel(x, y - radius)){collision=true;continue;}\n+           if (collision_mask-&gt;TestPixel(x + radius, y - radius)){collision=true;continue;}\n+           if (collision_mask-&gt;TestPixel(x - radius, y - radius)){collision=true;continue;}\n            if (collision_mask-&gt;TestPixel(x + radius, y)){collision=true;continue;}\n            if (collision_mask-&gt;TestPixel(x - radius, y)){collision=true;continue;}\n            p-&gt;SetProbeState(x,y, 1-rand()%20\/10.0, 1-rand()%20\/10.0, false);<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/probe.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code> #include &quot;configmanager.h&quot;\n+#include &quot;collisionmask.h&quot;\n #include &lt;SDL\/SDL_gfxPrimitives.h&gt;\n\n\n         \/\/ add power to push off with if pushing off\n         if ( (PUSH_POWERING == pushOffState) && (pushOffSpeed &lt; MAXSPEED) ) {\n                 pushOffSpeed += MAXSPEED\/POWERUPTIME;\n         }\n\n+    \/\/ --- \u5b8c\u5168\u306b\u56f2\u307e\u308c\u3066\u3044\u308b\u304b\u30c1\u30a7\u30c3\u30af ---\n+    int radius = p-&gt;GetWidth();\n+    bool leftWall  = collision_mask-&gt;TestPixel((int)(x_position - 25), (int)y_position);\n+    bool rightWall = collision_mask-&gt;TestPixel((int)(x_position + 25), (int)y_position);\n+    bool upWall    = collision_mask-&gt;TestPixel((int)x_position, (int)(y_position - 25));\n+    bool downWall  = collision_mask-&gt;TestPixel((int)x_position, (int)(y_position + 25));\n+\n+    if (leftWall && rightWall && upWall && downWall) {\n+\n+        \/\/ --- \u30e9\u30f3\u30c0\u30e0\u5b89\u5168\u4f4d\u7f6e\u3092\u63a2\u3059 ---\n+        for (int i = 0; i &lt; 20; i++) {\n+            int rx = 50 + rand() % (collision_mask-&gt;GetWidth()-100);\n+            int ry = 50 + rand() % (collision_mask-&gt;GetHeight()-100);\n+\n+            \/\/ \u58c1\u3067\u306a\u3044\u4f4d\u7f6e\u306a\u3089\u5b89\u5168\n+            if (!collision_mask-&gt;TestPixel(rx, ry)) {\n+                x_position = rx;\n+                y_position = ry;\n+\n+                \/\/ \u901f\u5ea6\u30ea\u30bb\u30c3\u30c8\n+                x_velocity = 0;\n+                y_velocity = 0;\n+\n+                return; \/\/ \u30c6\u30ec\u30dd\u30fc\u30c8\u6210\u529f\n+            }\n+        }\n+\n+        \/\/ --- \u5b89\u5168\u4f4d\u7f6e\u304c\u898b\u3064\u304b\u3089\u306a\u304b\u3063\u305f \u2192 \u81ea\u7206 ---\n+        Die();\n+        return;\n+    }\n }<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">scons<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#\u9ad8\u901f\u5316\u8a2d\u5b9a<br \/>#\u753b\u9762\u3001\u30b5\u30a6\u30f3\u30c9\u3001CPU\u6700\u9069\u5316<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/renderer.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-screen = SDL_SetVideoMode(width, height, 0, flags);\n+screen = SDL_SetVideoMode(width, height, 16, flags);<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/soundmanager.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-    Mix_OpenAudio(44100,MIX_DEFAULT_FORMAT,2,512);\n+    Mix_OpenAudio(11025,MIX_DEFAULT_FORMAT,2,512);<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi SConstruct<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-env = Environment(CPPPATH=includepath)\n+env = Environment(\n+    CPPPATH=includepath,\n+    CCFLAGS=&#39;-march=armv5te -mtune=arm926ej-s -mfloat-abi=soft -O3 -fomit-frame-pointer -ffast-math&#39;\n+)\n\n-    env.Append(CCFLAGS = &#39;-g&#39;)\n+    env.Append(CCFLAGS = &#39; -g&#39;)<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"> vi include\/probe.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code> #define PROBE_H\n\n+extern float sin_table[360];\n+extern float cos_table[360];\n\n #define RECHARGE_FRAME_INTERVAL_ON 50\n #define RECHARGE_FRAME_INTERVAL_OFF 3000\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/main.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code> #include &quot;log.h&quot;\n+#include &lt;math.h&gt;\n\n+float sin_table[360];\n+float cos_table[360];\n\n\n\n+for (int i = 0; i &lt; 360; i++) {\n+    float rad = i * M_PI \/ 180.0f;\n+    sin_table[i] = sin(rad);\n+    cos_table[i] = cos(rad);\n+}\n while(menu-&gt;Run())\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/probe.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code> void Probe::DrawOnto(SDL_Surface* destination)\n {\n\n  \u30fb\u30fb\u30fb\u30fb\n\n         \/\/ Experimental aiming indicator\n         Uint32 aimerColor = 0xFFD700FF;\n-        float x_direction = cos(facing_angle);\n-        float y_direction = sin(facing_angle);\n+        \/\/ ---- angle \u2192 table index ----\n+        int ang = (int)(facing_angle * 180.0f \/ M_PI);\n+        ang = (ang % 360 + 360) % 360;\n+        float x_direction = cos_table[ang];\n+        float y_direction = sin_table[ang];\n         int x_pos = int(x_position + x_direction*PROBEWIDTH*3.0\/5);\n         int y_pos = int(y_position + y_direction*PROBEHEIGHT*3.0\/5);\n         circleColor(destination, x_pos, y_pos, 1, aimerColor);\n         if (powerups & EFFECT_SPREADFIRE) { \/\/ draw extra guns\n-            x_direction = cos(facing_angle + M_PI\/48);\n-            y_direction = sin(facing_angle + M_PI\/48);\n+            \/\/ +3.75\u00b0 \u2192 +4\u00b0\u3067\u8fd1\u4f3c\n+            int ang_plus = ang + 4;\n+            if (ang_plus &gt;= 360) ang_plus -= 360;\n+            x_direction = cos_table[ang_plus];\n+            y_direction = sin_table[ang_plus];\n-            x_pos = int(x_position + cos(facing_angle + M_PI\/12)*PROBEWIDTH*3.0\/5);\n-            y_pos = int(y_position + sin(facing_angle + M_PI\/12)*PROBEHEIGHT*3.0\/5);\n+            \/\/ muzzle offset +15\u00b0\n+            int muzzle_plus = ang + 15;\n+            if (muzzle_plus &gt;= 360) muzzle_plus -= 360;\n+            x_pos = int(x_position + cos_table[muzzle_plus] * PROBEWIDTH * 3.0f \/ 5);\n+            y_pos = int(y_position + sin_table[muzzle_plus] * PROBEHEIGHT * 3.0f \/ 5);\n             circleColor(destination, x_pos, y_pos, 1, aimerColor);\n+            \/\/ -3.75\u00b0 \u2192 -4\u00b0\u3067\u8fd1\u4f3c\n-            x_direction = cos(facing_angle - M_PI\/48);\n-            y_direction = sin(facing_angle - M_PI\/48);\n+            int ang_minus = ang - 4;\n+            if (ang_minus &lt; 0) ang_minus += 360;\n+            x_direction = cos_table[ang_minus];\n+            y_direction = sin_table[ang_minus];\n-            x_pos = int(x_position + cos(facing_angle - M_PI\/12)*PROBEWIDTH*3.0\/5);\n-            y_pos = int(y_position + sin(facing_angle - M_PI\/12)*PROBEHEIGHT*3.0\/5);\n+            \/\/ muzzle offset -15\u00b0\n+            int muzzle_minus = ang - 15;\n+            if (muzzle_minus &lt; 0) muzzle_minus += 360;\n+            x_pos = int(x_position + cos_table[muzzle_minus] * PROBEWIDTH * 3.0f \/ 5);\n+            y_pos = int(y_position + sin_table[muzzle_minus] * PROBEHEIGHT * 3.0f \/ 5);\n             circleColor(destination, x_pos, y_pos, 1, aimerColor);\n         }\n \n  \u30fb\u30fb\u30fb\u30fb\n }\n\n\nvoid Probe::DrawAmmo(SDL_Surface* destination)\n{\n    if (GetCharge() &gt; 0) {\n        SDL_Surface* s = Renderer::sprite_registry[&quot;probe&quot;];\n        if (!s) throw &quot;no sprite found for entity!&quot;;\n        SDL_Rect sourceRect = {0, PROBEHEIGHT*2, AMMOWIDTH, AMMOHEIGHT};\n\n        ammo_angle += M_PI\/48;\n        if (ammo_angle &gt; 2*M_PI) { ammo_angle -= 2*M_PI;}\n        \/\/ initialize calculation variables.\n        double ammoAngle = 0;\n        SDL_Rect target_rect;\n\n        for (int currentCharge = 0;currentCharge &lt; GetCharge(); currentCharge++) {\n            ammoAngle = ((2*M_PI)\/GetCharge())*currentCharge;\n            ammoAngle += ammo_angle;\n\n-           float x_direction = cos(ammoAngle);\n-           float y_direction = sin(ammoAngle);\n+           \/\/ ---- angle \u2192 table index ----\n+           int ang = (int)(ammoAngle * 180.0f \/ M_PI);\n+           ang = (ang % 360 + 360) % 360;\n+           float x_direction = cos_table[ang];\n+           float y_direction = sin_table[ang];\n            float x_pos = x_position + x_direction*PROBEWIDTH*3\/8; \/\/ 3\/4 probe radius\n            float y_pos = y_position + y_direction*PROBEHEIGHT*3\/8;\n            target_rect.x = Sint16(x_pos - AMMOWIDTH\/2);\n            target_rect.y = Sint16(y_pos - AMMOHEIGHT\/2);\n\n            \/\/ draw ammo frames.\n            SDL_BlitSurface( s, &sourceRect, destination, &target_rect);\n        }\n    }\n}\n\n\n void Probe::PushOff (  )\n {\n         if (stuck){\n-                x_velocity = pushOffSpeed*cos(facing_angle);\n-                y_velocity = pushOffSpeed*sin(facing_angle);\n+                int ang = (int)(facing_angle * 180.0f \/ M_PI);\n+                ang = (ang % 360 + 360) % 360;\n+                if (pushOffSpeed &lt; 1.0f)\n+                    pushOffSpeed = 1.0f;\n+                x_velocity = pushOffSpeed*cos_table[ang];\n+                y_velocity = pushOffSpeed*sin_table[ang];\n                 pushOffSpeed = 0;\n                 game_manager-&gt;PlaySound(&quot;probe push&quot;);\n         }\n         stuck = false;\n         pushOffState = 0;\n }\n\n\n void Probe::Fire (  )\n {\n     \/\/ make sure you can&#39;t fire when you&#39;re dead\n     if (death_frame) { return;}\n         if(charge_remaining &gt; 1){\n                 charge_remaining -= 1;\n\n+        \/\/ ---- angle \u2192 table index ----\n+        int ang = (int)(facing_angle * 180.0f \/ M_PI);\n+        ang = (ang % 360 + 360) % 360;\n         \/\/ fire the projectile\n-        float x_direction = cos(facing_angle);\n-        float y_direction = sin(facing_angle);\n+        float x_direction = cos_table[ang];\n+        float y_direction = sin_table[ang];\n         float x_pos = x_position + x_direction*2*PROBEWIDTH\/3;\n         float y_pos = y_position + y_direction*2*PROBEHEIGHT\/3;\n         if (!Projectile::Add_Probe_Velocity) game_manager-&gt;CreateProjectile(owner, x_pos, y_pos , x_direction*Projectile::SPEED, y_direction*Projectile::SPEED);\n         else game_manager-&gt;CreateProjectile(owner, x_pos, y_pos , x_direction*Projectile::SPEED+x_velocity, y_direction*Projectile::SPEED+y_velocity);\n                 if (powerups & EFFECT_SPREADFIRE) { \/\/ fire 2 bonus shots\n-                        x_direction = cos(facing_angle + M_PI\/48);\n-                        y_direction = sin(facing_angle + M_PI\/48);\n-            x_pos = x_position + cos(facing_angle + M_PI\/12)*2*PROBEWIDTH\/3;\n-            y_pos = y_position + sin(facing_angle + M_PI\/12)*2*PROBEHEIGHT\/3;\n+                        \/\/ + angle\n+                        int ang2 = ang + 4;  \/\/ M_PI\/48 \u2252 3.75\u00b0\n+                        if (ang2 &gt;= 360) ang2 -= 360;\n+                        x_direction = cos_table[ang2];\n+                        y_direction = sin_table[ang2];\n+            x_pos = x_position + cos_table[(ang + 15) % 360]*2*PROBEWIDTH\/3;\n+            y_pos = y_position + sin_table[(ang + 15) % 360]*2*PROBEHEIGHT\/3;\n             if (!Projectile::Add_Probe_Velocity) game_manager-&gt;CreateProjectile(owner, x_pos, y_pos , x_direction*Projectile::SPEED, y_direction*Projectile::SPEED);\n             else game_manager-&gt;CreateProjectile(owner, x_pos, y_pos , x_direction*4+x_velocity, y_direction*Projectile::SPEED+y_velocity);\n-                        x_direction = cos(facing_angle - M_PI\/48);\n-                        y_direction = sin(facing_angle - M_PI\/48);\n-            x_pos = x_position + cos(facing_angle - M_PI\/12)*2*PROBEWIDTH\/3;\n-            y_pos = y_position + sin(facing_angle - M_PI\/12)*2*PROBEHEIGHT\/3;\n+                        \/\/ - angle\n+                        int ang3 = ang - 4;\n+                        if (ang3 &lt; 0) ang3 += 360;\n+                        x_direction = cos_table[ang3];\n+                        y_direction = sin_table[ang3];\n+            x_pos = x_position + cos_table[(ang + 360 - 15) % 360]*2*PROBEWIDTH\/3;\n+            y_pos = y_position + sin_table[(ang + 360 - 15) % 360]*2*PROBEHEIGHT\/3;\n             if (!Projectile::Add_Probe_Velocity) game_manager-&gt;CreateProjectile(owner, x_pos, y_pos , x_direction*Projectile::SPEED, y_direction*Projectile::SPEED);\n             else game_manager-&gt;CreateProjectile(owner, x_pos, y_pos , x_direction*Projectile::SPEED+x_velocity, y_direction*Projectile::SPEED+y_velocity);\n                 }\n                 \/\/ now the reaction from firing if not stuck to a wall\n                 if (!stuck){\n                         x_velocity -= x_direction\/4;\n                         y_velocity -= y_direction\/4;\n                 }\n                 game_manager-&gt;PlaySound(&quot;fire&quot;);\n         }\n }\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">scons -c<br \/>scons<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%94%B9%E9%80%A0%E3%81%AE%E3%81%8A%E6%99%82%E9%96%93\"><\/span>\u6539\u9020\u306e\u304a\u6642\u9593<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u3053\u3053\u304b\u3089\u306f\u6539\u9020\u306e\u6642\u9593\u3002\u5fc5\u9808\u3067\u306f\u306a\u3044\u306e\u3067\u304a\u597d\u307f\u3067\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#\u5f3e\u3092\u6483\u3063\u305f\u6642\u306e\u53cd\u52d5\u3092\u5f37\u304f\u3059\u308b\u3002<br \/>#(\u30aa\u30ea\u30b8\u30ca\u30eb\u3060\u3068\u307b\u3068\u3093\u3069\u53cd\u52d5\u304c\u7121\u3044\u306e\u3067\u3001\u5143\u306e\uff18\u500d\u306e\u53cd\u52d5\u306b\u3059\u308b\u5834\u5408)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/probe.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>                if (!stuck){\n-                        x_velocity -= x_direction\/4;\n-                        y_velocity -= y_direction\/4;\n+                        x_velocity -= x_direction*2;\n+                        y_velocity -= y_direction*2;\n                }\n                game_manager-&gt;PlaySound(&quot;fire&quot;);\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">scons<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#\u5f3e\uff1f\u306e\u30c1\u30e3\u30fc\u30b8\u901f\u5ea6\u3092\u4e0a\u3052\u308b[\u3082\u3057\u304b\u3057\u305f\u3089\u30b7\u30fc\u30eb\u30c9\u304b\u3082]\u3002<br \/>#(\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\uff12\u500d\u306e\u30c1\u30e3\u30fc\u30b8\u901f\u5ea6):<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vi inclide\/probe.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-#define RECHARGE_FRAME_INTERVAL_ON 50\n-#define RECHARGE_FRAME_INTERVAL_OFF 3000\n\n+#define RECHARGE_FRAME_INTERVAL_ON 25\n+#define RECHARGE_FRAME_INTERVAL_OFF 1500\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">scons<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#\u6700\u5927\u5f3e\u6570\u3001\u5f3e\u306e\u30c1\u30e3\u30fc\u30b8\u901f\u5ea6\u306e\u8abf\u6574(xml\u30d5\u30a1\u30a4\u30eb\u306e\u5909\u66f4\u3067\u5bfe\u5fdc\u53ef\u80fd)<br \/>maxcharge\u3000\u3000\uff1a\u6700\u5927\u5f3e\u6570\u3000\u3000\u3000\u3000\u3000\u4f8b\uff1a5-&gt;10<br \/>rechargetime\u3000\uff1a\u5f3e\u306e\u30c1\u30e3\u30fc\u30b8\u901f\u5ea6\u3000\u4f8b\uff1a400-&gt;200<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bin\/config.xml<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>    &lt;Probe&gt;\n        &lt;maxhits value=&quot;3&quot; \/&gt;\n        &lt;maxcharge value=&quot;5&quot; \/&gt;\n        &lt;rechargetime value=&quot;400&quot; \/&gt;\n        &lt;maxspeed value=&quot;3&quot; \/&gt;\n        &lt;poweruptime value=&quot;10&quot; \/&gt;\n        &lt;turningspeed value=&quot;0.041666667&quot; \/&gt;\n    &lt;\/Probe&gt;<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">#\u6700\u5927\u5f3e\u6570\u306e\uff12\u500d\u5f3e\u3092\u6253\u3066\u308b\u3088\u3046\u306b\u3059\u308b<br \/>#\uff08\u305f\u3060\u3057\u6575\u306e\u5f3e\u3082\u5927\u91cf\u306b\u51fa\u308b\u3088\u3046\u306b\u306a\u308b\u306e\u3067\u96e3\u6613\u5ea6\u3082\u4e0a\u304c\u308a\u307e\u3059\u3002\uff09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/probe.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>-charge_remaining -= 1\n+charge_remaining -= 0.5<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">scons<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">AI\u306eC\uff0b\uff0b\u79fb\u690d<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">AI\u306f\u3001Python2.4\u306eC API\u3092\u5229\u7528\u3057\u3066\u3044\u308b\u305f\u3081\u3001<br \/>Teixie\u3067\u624b\u52d5\u4f7f\u7528\u53ef\u80fd\u306aPython2.7\u3067\u306f\u7a3c\u50cd\u3057\u306a\u3044\u3088\u3046\u3067\u3059\u3002<br \/>Python2.4\u306f\u958b\u767a\u7528\u30bd\u30fc\u30b9\u3059\u3089\u4f9d\u5b58\u95a2\u4fc2\u3067\u5c0e\u5165\u3067\u304d\u306a\u3044\u306e\u3067\u3001<br \/>\u3053\u306e\u307e\u307e\u3067\u306fAI\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3067\u3059\u306e\u3067\u3001Python2.4\u88fdAI\u30b3\u30fc\u30c9\u3092C\uff0b\uff0b\u306b\u79fb\u690d\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">balderaiAI\uff08balderai.py \u306e\u5b8c\u5168 C++ \u79fb\u690d\uff09<br \/>\u30d1\u30ef\u30fc\u30a2\u30c3\u30d7\u512a\u5148\uff0b\u5c04\u6483\u9593\u9694\u8abf\u6574\uff0b\u30b9\u30bf\u30c3\u30af\u8131\u51fa<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RandomAI\uff08randomai.py \u306e C++ \u79fb\u690d\uff09<br \/>\u5b8c\u5168\u30e9\u30f3\u30c0\u30e0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SimpleAimerAI\uff08simple_aimer.py \u306e C++ \u79fb\u690d\uff09<br \/>\u6700\u3082\u8fd1\u3044\u6575\u306b\u5411\u3051\u3066\u6483\u3064<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u8ffd\u52a0<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">AggressiveAI\uff08\u653b\u6483\u7279\u5316\uff09<br \/>\u6575\u306b\u7a4d\u6975\u7684\u306b\u63a5\u8fd1\u3057\u5e38\u306b\u5c04\u6483\u3092\u512a\u5148\u3002\u56de\u907f\u3088\u308a\u653b\u6483\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DefensiveAI\uff08\u56de\u907f\u30fb\u751f\u5b58\u7279\u5316\uff09<br \/>\u6575\u304b\u3089\u8ddd\u96e2\u3092\u53d6\u58c1\u3084\u5f3e\u3092\u907f\u3051\u308b\u3002\u5c04\u6483\u3088\u308a\u751f\u5b58\u512a\u5148\u3067\u30d1\u30ef\u30fc\u30a2\u30c3\u30d7\u3092\u7a4d\u6975\u7684\u306b\u53d6\u308a\u306b\u884c\u304f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SniperAI<br \/>\u6700\u3082\u8fd1\u3044 1 \u4f53\u3060\u3051\u3092\u30bf\u30fc\u30b2\u30c3\u30c8\u306b\u3059\u308b\u300c\u4e00\u70b9\u96c6\u4e2d\u578b\u300d\u300c\u8996\u91ce\u304c\u72ed\u3044\u304c\u7cbe\u5bc6\u300d\u306a\u305f\u3081\u8fd1\u3065\u304f\u3068\u5371\u967a<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u65b0\u898f\u8ffd\u52a0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">mkdir src\/ai<br \/>vi src\/ai\/BaseAI.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#ifndef BALDER_BASEAI_H\n#define BALDER_BASEAI_H\n\n#include &lt;vector&gt;\n#include &quot;balder2dtypes.h&quot;\n\nnamespace Balder {\n\nclass Probe;\nclass Entity;\nstruct CollisionMask;\n\nclass BaseAI {\npublic:\n    virtual ~BaseAI() {}\n\n    virtual input_states Update(\n        Probe* self,\n        const std::vector&lt;Probe*&gt;& probes,\n        const std::vector&lt;Entity*&gt;& projectiles,\n        const std::vector&lt;Entity*&gt;& powerups,\n        CollisionMask* geometry\n    ) = 0;\n};\n\n}\n\n#endif<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/DefaultAI.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#ifndef BALDER_DEFAULTAI_H\n#define BALDER_DEFAULTAI_H\n\n#include &quot;BaseAI.h&quot;\n\nnamespace Balder {\n\nclass DefaultAI : public BaseAI {\npublic:\n    input_states Update(\n        Probe* self,\n        const std::vector&lt;Probe*&gt;& probes,\n        const std::vector&lt;Entity*&gt;& projectiles,\n        const std::vector&lt;Entity*&gt;& powerups,\n        CollisionMask* geometry\n    ) override;\n};\n\n}\n\n#endif<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/DefaultAI.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#include &quot;DefaultAI.h&quot;\n#include &quot;probe.h&quot;\n#include &quot;entity.h&quot;\n#include &quot;collisionmask.h&quot;\n#include &quot;input.h&quot;\n#include &quot;balder2dtypes.h&quot;\n#include &lt;cmath&gt;\n\nusing namespace Balder;\n\nstatic Probe* FindClosestProbe(Probe* self, const std::vector&lt;Probe*&gt;& probes) {\n    Probe* best = nullptr;\n    float bestDist2 = 0.0f;\n    float x = self-&gt;GetX();\n    float y = self-&gt;GetY();\n\n    for (Probe* p : probes) {\n        if (p-&gt;GetOwner() == self-&gt;GetOwner()) continue;\n        float dx = p-&gt;GetX() - x;\n        float dy = p-&gt;GetY() - y;\n        float d2 = dx*dx + dy*dy;\n        if (!best || d2 &lt; bestDist2) {\n            best = p;\n            bestDist2 = d2;\n        }\n    }\n    return best;\n}\n\nstatic Entity* FindClosestEntity(float x, float y, const std::vector&lt;Entity*&gt;& list) {\n    Entity* best = nullptr;\n    float bestDist2 = 0.0f;\n\n    for (Entity* e : list) {\n        float dx = e-&gt;GetX() - x;\n        float dy = e-&gt;GetY() - y;\n        float d2 = dx*dx + dy*dy;\n        if (!best || d2 &lt; bestDist2) {\n            best = e;\n            bestDist2 = d2;\n        }\n    }\n    return best;\n}\n\ninput_states DefaultAI::Update(\n    Probe* self,\n    const std::vector&lt;Probe*&gt;& probes,\n    const std::vector&lt;Entity*&gt;& projectiles,\n    const std::vector&lt;Entity*&gt;& powerups,\n    CollisionMask* geometry\n) {\n    float x = self-&gt;GetX();\n    float y = self-&gt;GetY();\n\n    input_states inputs = 0;\n\n    \/\/ powerup \u512a\u5148\n    if (!powerups.empty() && self-&gt;GetStuckStatus()) {\n        Entity* pu = FindClosestEntity(x, y, powerups);\n        if (pu) {\n            float dx = pu-&gt;GetX() - x;\n            float dy = pu-&gt;GetY() - y;\n            float targetAngle = std::atan2(dy, dx);\n            float currentAngle = self-&gt;GetRotationAngle();\n            float diff = targetAngle - currentAngle;\n\n            while (diff &gt;  M_PI) diff -= 2*M_PI;\n            while (diff &lt; -M_PI) diff += 2*M_PI;\n\n            if (diff &gt; 0.1f) return RIGHT;\n            if (diff &lt; -0.1f) return LEFT;\n\n            return STICK;\n        }\n    }\n\n    \/\/ \u6575\u3092\u72d9\u3046\n    Probe* target = FindClosestProbe(self, probes);\n    if (!target) return 0;\n\n    float dx = target-&gt;GetX() - x;\n    float dy = target-&gt;GetY() - y;\n    float targetAngle = std::atan2(dy, dx);\n    float currentAngle = self-&gt;GetRotationAngle();\n    float diff = targetAngle - currentAngle;\n\n    while (diff &gt;  M_PI) diff -= 2*M_PI;\n    while (diff &lt; -M_PI) diff += 2*M_PI;\n\n    if (diff &gt; 0.1f) return RIGHT;\n    if (diff &lt; -0.1f) return LEFT;\n\n    return FIRE;\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/BalderAI.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#ifndef BALDER_BALDERAI_H\n#define BALDER_BALDERAI_H\n\n#include &quot;BaseAI.h&quot;\n\nnamespace Balder {\n\nclass BalderAI : public BaseAI {\npublic:\n    input_states Update(\n        Probe* self,\n        const std::vector&lt;Probe*&gt;& probes,\n        const std::vector&lt;Entity*&gt;& projectiles,\n        const std::vector&lt;Entity*&gt;& powerups,\n        CollisionMask* geometry\n    ) override;\n};\n\n}\n\n#endif<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/BalderAI.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#include &quot;BalderAI.h&quot;\n#include &quot;probe.h&quot;\n#include &quot;entity.h&quot;\n#include &quot;collisionmask.h&quot;\n#include &quot;input.h&quot;\n#include &quot;balder2dtypes.h&quot;\n#include &lt;cmath&gt;\n\nusing namespace Balder;\n\nstatic Probe* FindClosestProbe(Probe* self, const std::vector&lt;Probe*&gt;& probes) {\n    Probe* best = nullptr;\n    float bestDist2 = 0.0f;\n    float x = self-&gt;GetX();\n    float y = self-&gt;GetY();\n\n    for (Probe* p : probes) {\n        if (p-&gt;GetOwner() == self-&gt;GetOwner()) continue;\n        float dx = p-&gt;GetX() - x;\n        float dy = p-&gt;GetY() - y;\n        float d2 = dx*dx + dy*dy;\n        if (!best || d2 &lt; bestDist2) {\n            best = p;\n            bestDist2 = d2;\n        }\n    }\n    return best;\n}\n\nstatic Entity* FindClosestEntity(float x, float y, const std::vector&lt;Entity*&gt;& list) {\n    Entity* best = nullptr;\n    float bestDist2 = 0.0f;\n\n    for (Entity* e : list) {\n        float dx = e-&gt;GetX() - x;\n        float dy = e-&gt;GetY() - y;\n        float d2 = dx*dx + dy*dy;\n        if (!best || d2 &lt; bestDist2) {\n            best = e;\n            bestDist2 = d2;\n        }\n    }\n    return best;\n}\n\ninput_states BalderAI::Update(\n    Probe* self,\n    const std::vector&lt;Probe*&gt;& probes,\n    const std::vector&lt;Entity*&gt;& projectiles,\n    const std::vector&lt;Entity*&gt;& powerups,\n    CollisionMask* geometry\n) {\n    float x = self-&gt;GetX();\n    float y = self-&gt;GetY();\n\n    input_states inputs = 0;\n\n    \/\/ powerup \u512a\u5148\n    if (!powerups.empty() && self-&gt;GetStuckStatus()) {\n        Entity* pu = FindClosestEntity(x, y, powerups);\n        if (pu) {\n            float dx = pu-&gt;GetX() - x;\n            float dy = pu-&gt;GetY() - y;\n            float targetAngle = std::atan2(dy, dx);\n            float currentAngle = self-&gt;GetRotationAngle();\n            float diff = targetAngle - currentAngle;\n\n            while (diff &gt;  M_PI) diff -= 2*M_PI;\n            while (diff &lt; -M_PI) diff += 2*M_PI;\n\n            if (diff &gt; 0.1f) return RIGHT;\n            if (diff &lt; -0.1f) return LEFT;\n\n            return STICK;\n        }\n    }\n\n    \/\/ \u6575\u3092\u72d9\u3046\n    Probe* target = FindClosestProbe(self, probes);\n    if (!target) return 0;\n\n    float dx = target-&gt;GetX() - x;\n    float dy = target-&gt;GetY() - y;\n    float targetAngle = std::atan2(dy, dx);\n    float currentAngle = self-&gt;GetRotationAngle();\n    float diff = targetAngle - currentAngle;\n\n    while (diff &gt;  M_PI) diff -= 2*M_PI;\n    while (diff &lt; -M_PI) diff += 2*M_PI;\n\n    if (diff &gt; 0.1f) return RIGHT;\n    if (diff &lt; -0.1f) return LEFT;\n\n    return FIRE;\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/RandomAI.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#ifndef BALDER_RANDOMAI_H\n#define BALDER_RANDOMAI_H\n\n#include &quot;BaseAI.h&quot;\n#include &lt;cstdlib&gt;\n\nnamespace Balder {\n\nclass RandomAI : public BaseAI {\npublic:\n    input_states Update(\n        Probe* self,\n        const std::vector&lt;Probe*&gt;& probes,\n        const std::vector&lt;Entity*&gt;& projectiles,\n        const std::vector&lt;Entity*&gt;& powerups,\n        CollisionMask* geometry\n    ) override {\n        return rand() % 17;\n    }\n};\n\n}\n\n#endif<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/SimpleAimerAI.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#ifndef BALDER_SIMPLEAIMERAI_H\n#define BALDER_SIMPLEAIMERAI_H\n\n#include &quot;BaseAI.h&quot;\n\nnamespace Balder {\n\nclass SimpleAimerAI : public BaseAI {\npublic:\n    input_states Update(\n        Probe* self,\n        const std::vector&lt;Probe*&gt;& probes,\n        const std::vector&lt;Entity*&gt;& projectiles,\n        const std::vector&lt;Entity*&gt;& powerups,\n        CollisionMask* geometry\n    ) override;\n};\n\n}\n\n#endif<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/SimpleAimerAI.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#include &quot;SimpleAimerAI.h&quot;\n#include &quot;probe.h&quot;\n#include &quot;input.h&quot;\n#include &quot;balder2dtypes.h&quot;\n#include &lt;cmath&gt;\n\nusing namespace Balder;\n\ninput_states SimpleAimerAI::Update(\n    Probe* self,\n    const std::vector&lt;Probe*&gt;& probes,\n    const std::vector&lt;Entity*&gt;&,\n    const std::vector&lt;Entity*&gt;&,\n    CollisionMask*\n) {\n    float x = self-&gt;GetX();\n    float y = self-&gt;GetY();\n\n    Probe* target = nullptr;\n    float bestDist2 = 0.0f;\n\n    for (Probe* p : probes) {\n        if (p-&gt;GetOwner() == self-&gt;GetOwner()) continue;\n        float dx = p-&gt;GetX() - x;\n        float dy = p-&gt;GetY() - y;\n        float d2 = dx*dx + dy*dy;\n        if (!target || d2 &lt; bestDist2) {\n            target = p;\n            bestDist2 = d2;\n        }\n    }\n\n    if (!target) return 0;\n\n    float dx = target-&gt;GetX() - x;\n    float dy = target-&gt;GetY() - y;\n    float targetAngle = std::atan2(dy, dx);\n    float currentAngle = self-&gt;GetRotationAngle();\n    float diff = targetAngle - currentAngle;\n\n    while (diff &gt;  M_PI) diff -= 2*M_PI;\n    while (diff &lt; -M_PI) diff += 2*M_PI;\n\n    if (diff &gt; 0.1f) return RIGHT;\n    if (diff &lt; -0.1f) return LEFT;\n\n    return FIRE;\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/AggressiveAI.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#ifndef BALDER_AGGRESSIVEAI_H\n#define BALDER_AGGRESSIVEAI_H\n\n#include &quot;BaseAI.h&quot;\n\nnamespace Balder {\n\nclass AggressiveAI : public BaseAI {\npublic:\n    input_states Update(\n        Probe* self,\n        const std::vector&lt;Probe*&gt;& probes,\n        const std::vector&lt;Entity*&gt;& projectiles,\n        const std::vector&lt;Entity*&gt;& powerups,\n        CollisionMask* geometry\n    ) override;\n};\n\n}\n\n#endif<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/AggressiveAI.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#include &quot;AggressiveAI.h&quot;\n#include &quot;probe.h&quot;\n#include &quot;input.h&quot;\n#include &quot;balder2dtypes.h&quot;\n#include &lt;cmath&gt;\n\nusing namespace Balder;\n\ninput_states AggressiveAI::Update(\n    Probe* self,\n    const std::vector&lt;Probe*&gt;& probes,\n    const std::vector&lt;Entity*&gt;&,\n    const std::vector&lt;Entity*&gt;&,\n    CollisionMask*\n) {\n    float x = self-&gt;GetX();\n    float y = self-&gt;GetY();\n\n    Probe* target = nullptr;\n    float bestDist2 = 0.0f;\n\n    for (Probe* p : probes) {\n        if (p-&gt;GetOwner() == self-&gt;GetOwner()) continue;\n        float dx = p-&gt;GetX() - x;\n        float dy = p-&gt;GetY() - y;\n        float d2 = dx*dx + dy*dy;\n        if (!target || d2 &lt; bestDist2) {\n            target = p;\n            bestDist2 = d2;\n        }\n    }\n\n    if (!target) return 0;\n\n    float dx = target-&gt;GetX() - x;\n    float dy = target-&gt;GetY() - y;\n    float targetAngle = std::atan2(dy, dx);\n    float currentAngle = self-&gt;GetRotationAngle();\n    float diff = targetAngle - currentAngle;\n\n    while (diff &gt;  M_PI) diff -= 2*M_PI;\n    while (diff &lt; -M_PI) diff += 2*M_PI;\n\n    const float turnThresh = 0.05f;\n\n    if (diff &gt; turnThresh) return RIGHT;\n    if (diff &lt; -turnThresh) return LEFT;\n\n    return FIRE;\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/DefensiveAI.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#ifndef BALDER_DEFENSIVEAI_H\n#define BALDER_DEFENSIVEAI_H\n\n#include &quot;BaseAI.h&quot;\n\nnamespace Balder {\n\nclass DefensiveAI : public BaseAI {\npublic:\n    input_states Update(\n        Probe* self,\n        const std::vector&lt;Probe*&gt;& probes,\n        const std::vector&lt;Entity*&gt;& projectiles,\n        const std::vector&lt;Entity*&gt;& powerups,\n        CollisionMask* geometry\n    ) override;\n};\n\n}\n\n#endif<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/DefensiveAI.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#include &quot;DefensiveAI.h&quot;\n#include &quot;probe.h&quot;\n#include &quot;entity.h&quot;\n#include &quot;collisionmask.h&quot;\n#include &quot;input.h&quot;\n#include &quot;balder2dtypes.h&quot;\n#include &lt;cmath&gt;\n\nusing namespace Balder;\n\ninput_states DefensiveAI::Update(\n    Probe* self,\n    const std::vector&lt;Probe*&gt;& probes,\n    const std::vector&lt;Entity*&gt;&,\n    const std::vector&lt;Entity*&gt;& powerups,\n    CollisionMask*\n) {\n    float x = self-&gt;GetX();\n    float y = self-&gt;GetY();\n\n    \/\/ \u30d1\u30ef\u30fc\u30a2\u30c3\u30d7\u512a\u5148\n    if (!powerups.empty()) {\n        Entity* best = nullptr;\n        float bestDist2 = 0.0f;\n\n        for (Entity* e : powerups) {\n            float dx = e-&gt;GetX() - x;\n            float dy = e-&gt;GetY() - y;\n            float d2 = dx*dx + dy*dy;\n            if (!best || d2 &lt; bestDist2) {\n                best = e;\n                bestDist2 = d2;\n            }\n        }\n\n        if (best) {\n            float dx = best-&gt;GetX() - x;\n            float dy = best-&gt;GetY() - y;\n            float targetAngle = std::atan2(dy, dx);\n            float currentAngle = self-&gt;GetRotationAngle();\n            float diff = targetAngle - currentAngle;\n\n            while (diff &gt;  M_PI) diff -= 2*M_PI;\n            while (diff &lt; -M_PI) diff += 2*M_PI;\n\n            if (diff &gt; 0.1f) return RIGHT;\n            if (diff &lt; -0.1f) return LEFT;\n\n            return STICK;\n        }\n    }\n\n    \/\/ \u6575\u304b\u3089\u9003\u3052\u308b\n    Probe* closest = nullptr;\n    float bestDist2 = 0.0f;\n\n    for (Probe* p : probes) {\n        if (p-&gt;GetOwner() == self-&gt;GetOwner()) continue;\n        float dx = p-&gt;GetX() - x;\n        float dy = p-&gt;GetY() - y;\n        float d2 = dx*dx + dy*dy;\n        if (!closest || d2 &lt; bestDist2) {\n            closest = p;\n            bestDist2 = d2;\n        }\n    }\n\n    if (!closest) return 0;\n\n    float dx = x - closest-&gt;GetX();\n    float dy = y - closest-&gt;GetY();\n    float targetAngle = std::atan2(dy, dx);\n    float currentAngle = self-&gt;GetRotationAngle();\n    float diff = targetAngle - currentAngle;\n\n    while (diff &gt;  M_PI) diff -= 2*M_PI;\n    while (diff &lt; -M_PI) diff += 2*M_PI;\n\n    if (diff &gt; 0.1f) return RIGHT;\n    if (diff &lt; -0.1f) return LEFT;\n\n    return STICK;\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/WallFollowerAI.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#ifndef BALDER_WALLFOLLOWERAI_H\n#define BALDER_WALLFOLLOWERAI_H\n\n#include &quot;BaseAI.h&quot;\n\nnamespace Balder {\n\nclass WallFollowerAI : public BaseAI {\npublic:\n    WallFollowerAI() {}\n    virtual input_states Update(\n        Probe* self,\n        const std::vector&lt;Probe*&gt;& probes,\n        const std::vector&lt;Entity*&gt;& projectiles,\n        const std::vector&lt;Entity*&gt;& powerups,\n        CollisionMask* geometry\n    );\n};\n\n}\n\n#endif<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/ai\/WallFollowerAI.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#include &quot;WallFollowerAI.h&quot;\n#include &quot;probe.h&quot;\n#include &quot;entity.h&quot;\n#include &quot;collisionmask.h&quot;\n#include &quot;input.h&quot;\n#include &quot;balder2dtypes.h&quot;\n#include &lt;cmath&gt;\n\nusing namespace Balder;\n\ninput_states WallFollowerAI::Update(\n    Probe* self,\n    const std::vector&lt;Probe*&gt;&,\n    const std::vector&lt;Entity*&gt;&,\n    const std::vector&lt;Entity*&gt;&,\n    CollisionMask* geometry\n) {\n    input_states out = 0;\n\n    double x = self-&gt;GetX();\n    double y = self-&gt;GetY();\n\n    \/\/ \u58c1\u3068\u306e\u8ddd\u96e2\u30c1\u30a7\u30c3\u30af\uff0812px \u5148\u3092\u8abf\u3079\u308b\uff09\n    bool leftWall  = geometry-&gt;Collide(x - 12, y);\n    bool rightWall = geometry-&gt;Collide(x + 12, y);\n    bool upWall    = geometry-&gt;Collide(x, y - 12);\n    bool downWall  = geometry-&gt;Collide(x, y + 12);\n\n    \/\/ --- \u58c1\u6cbf\u3044\u79fb\u52d5\u30ed\u30b8\u30c3\u30af\uff08\u53f3\u624b\u6cd5\uff09 ---\n    \/\/ 1. \u53f3\u5074\u306b\u58c1\u304c\u3042\u308b \u2192 \u524d\u9032\uff08Stick\uff09\n    \/\/ 2. \u53f3\u5074\u306b\u58c1\u304c\u306a\u3044 \u2192 \u53f3\u306b\u65cb\u56de\n    \/\/ 3. \u6b63\u9762\u306b\u58c1\u304c\u3042\u308b \u2192 \u5de6\u306b\u65cb\u56de\n    \/\/ 4. \u305d\u308c\u4ee5\u5916 \u2192 \u524d\u9032\n\n    \/\/ \u6b63\u9762\u306e\u58c1\n    bool frontWall = geometry-&gt;Collide(\n        x + cos(self-&gt;GetRotationAngle()) * 12,\n        y + sin(self-&gt;GetRotationAngle()) * 12\n    );\n\n    \/\/ \u53f3\u5074\u306e\u58c1\uff08\u53f3\u65b9\u5411 90\u00b0\uff09\n    bool rightSideWall = geometry-&gt;Collide(\n        x + cos(self-&gt;GetRotationAngle() + M_PI\/2) * 12,\n        y + sin(self-&gt;GetRotationAngle() + M_PI\/2) * 12\n    );\n\n    if (!rightSideWall) {\n        \/\/ \u53f3\u306b\u58c1\u304c\u7121\u3044 \u2192 \u53f3\u3078\u65cb\u56de\n        out |= RIGHT;\n    } else if (frontWall) {\n        \/\/ \u6b63\u9762\u306b\u58c1 \u2192 \u5de6\u3078\u65cb\u56de\n        out |= LEFT;\n    } else {\n        \/\/ \u58c1\u306b\u6cbf\u3063\u3066\u524d\u9032\uff08Stick\uff09\n        out |= STICK;\n    }\n\n    return out;\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u3000<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u5dee\u3057\u66ff\u3048<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cp include\/computerprobecontrol.h include\/computerprobecontrol.h.bkpy<br \/>vi include\/computerprobecontrol.h<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#ifndef BALDER_COMPUTERPROBECONTROL_H\n#define BALDER_COMPUTERPROBECONTROL_H\n\n#include &quot;balder2dtypes.h&quot;\n#include &lt;string&gt;\n\nnamespace Balder {\n\nclass BaseAI;\n\nstruct ComputerProbeControl {\n    player_id id;\n    input_states inputs;\n    BaseAI* ai;\n\n    ComputerProbeControl(player_id pid, BaseAI* aiInstance)\n        : id(pid), inputs(0), ai(aiInstance) {}\n\n    ~ComputerProbeControl() {\n        delete ai;\n    }\n};\n\n}\n\n#endif<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">cp src\/computerprobecontrol.cpp src\/computerprobecontrol.cpp.bkpy<br \/>vi src\/computerprobecontrol.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#include &quot;computerprobecontrol.h&quot;\n\nusing namespace Balder;\n\n\/\/ \u5b9f\u88c5\u4e0d\u8981\u3002\n\/\/ \u3059\u3079\u3066\u306e\u51e6\u7406\u306f\u30d8\u30c3\u30c0\u5185\u306e\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\uff0f\u30c7\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u5b8c\u7d50\u3057\u307e\u3059\u3002\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">cp src\/artificialcontroller.cpp src\/artificialcontroller.cpp.bkpy<br \/>vi src\/artificialcontroller.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>#include &quot;artificialcontroller.h&quot;\n#include &quot;computerprobecontrol.h&quot;\n#include &quot;gamemanager.h&quot;\n#include &quot;collisionmask.h&quot;\n#include &quot;entity.h&quot;\n#include &quot;probe.h&quot;\n\n#include &quot;ai\/BaseAI.h&quot;\n#include &quot;ai\/DefaultAI.h&quot;\n#include &quot;ai\/BalderAI.h&quot;\n#include &quot;ai\/RandomAI.h&quot;\n#include &quot;ai\/SimpleAimerAI.h&quot;\n#include &quot;ai\/AggressiveAI.h&quot;\n#include &quot;ai\/DefensiveAI.h&quot;\n#include &quot;ai\/SniperAI.h&quot;\n#include &quot;ai\/WallFollowerAI.h&quot;\n\n#include &lt;cmath&gt;\n#include &lt;vector&gt;\n\nusing namespace Balder;\n\nGameManager* ArtificialController::game_manager = nullptr;\nCollisionMask* ArtificialController::geometry = nullptr;\nstd::list&lt;ComputerProbeControl*&gt; ArtificialController::controlled_probes;\n\nArtificialController::ArtificialController() {}\n\nvoid ArtificialController::Initialize()\n{\n    \/\/ Python \u306f\u5b8c\u5168\u524a\u9664\u3055\u308c\u305f\u305f\u3081\u3001\u3053\u3053\u3067\u306f\u4f55\u3082\u3057\u306a\u3044\n}\n\nvoid ArtificialController::ShutDown()\n{\n    for (auto* ctrl : controlled_probes)\n        delete ctrl;\n\n    controlled_probes.clear();\n}\n\nvoid ArtificialController::ControlProbe(player_id id, std::string aiName)\n{\n    BaseAI* ai = nullptr;\n\n    if (aiName == &quot;default&quot;)\n        ai = new DefaultAI();\n    else if (aiName == &quot;balderai&quot;)\n        ai = new BalderAI;\n    else if (aiName == &quot;randomai&quot;)\n        ai = new RandomAI();\n    else if (aiName == &quot;simple_aimer&quot;)\n        ai = new SimpleAimerAI();\n    else if (aiName == &quot;aggressive&quot;)\n        ai = new AggressiveAI();\n    else if (aiName == &quot;defensive&quot;)\n        ai = new DefensiveAI();\n    else if (aiName == &quot;sniperai&quot;)\n        ai = new SniperAI();\n    else if (aiName == &quot;wallfollower&quot;)\n        ai = new WallFollowerAI();\n    else\n        ai = new DefaultAI(); \/\/ fallback\n\n    controlled_probes.push_back(new ComputerProbeControl(id, ai));\n}\n\nvoid ArtificialController::StopControlling(player_id id)\n{\n    for (auto it = controlled_probes.begin(); it != controlled_probes.end(); ++it) {\n        if ((*it)-&gt;id == id) {\n            delete *it;\n            controlled_probes.erase(it);\n            return;\n        }\n    }\n}\n\nvoid ArtificialController::DoControl(std::list&lt;Entity*&gt;& entities)\n{\n    \/\/ \u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u5206\u985e\n    std::vector&lt;Probe*&gt; probes;\n    std::vector&lt;Entity*&gt; projectiles;\n    std::vector&lt;Entity*&gt; powerups;\n\n    for (Entity* e : entities) {\n        if (e-&gt;GetType() == &quot;probe&quot;) {\n            if (Probe* p = dynamic_cast&lt;Probe*&gt;(e))\n                probes.push_back(p);\n        }\n        else if (e-&gt;GetType() == &quot;projectile&quot;) {\n            projectiles.push_back(e);\n        }\n        else if (e-&gt;GetType() == &quot;powerup&quot;) {\n            powerups.push_back(e);\n        }\n    }\n\n    \/\/ \u5404 AI \u3092\u5b9f\u884c\n    for (auto it = controlled_probes.begin(); it != controlled_probes.end(); ++it) {\n        ComputerProbeControl* ctrl = *it;\n\n        \/\/ \u81ea\u5206\u306e Probe \u3092\u63a2\u3059\n        Probe* self = nullptr;\n        for (Probe* p : probes) {\n            if (p-&gt;GetOwner() == ctrl-&gt;id) {\n                self = p;\n                break;\n            }\n        }\n\n        if (!self)\n            continue;\n\n        \/\/ C++ AI \u3092\u5b9f\u884c\n        input_states newInputs =\n            ctrl-&gt;ai-&gt;Update(self, probes, projectiles, powerups, geometry);\n\n        \/\/ \u5165\u529b\u304c\u5909\u308f\u3063\u305f\u3089\u9001\u4fe1\n        if (newInputs != ctrl-&gt;inputs) {\n            ctrl-&gt;inputs = newInputs;\n            game_manager-&gt;SendInputState(ctrl-&gt;id, ctrl-&gt;inputs);\n        }\n    }\n}\n\nvoid ArtificialController::SetGeometry(CollisionMask* cm)\n{\n    geometry = cm;\n}\n\nvoid ArtificialController::SetGameManager(GameManager* gm)\n{\n    game_manager = gm;\n}<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><br \/>\u30bd\u30fc\u30b9\u306e\u4e00\u90e8\u5909\u66f4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vi src\/menu\/widgets\/ailistmodel.cpp<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code> void AIListModel::FindScripts()\n {\n-    std::string script_dir(&quot;scripts\/&quot;);\n-    \/\/ always show Human option as it disables any ai scripting so that a user may play.\n-        scriptnames.push_back(&quot;Human&quot;);\n-    ++numScripts;\n-    char **files = PHYSFS_enumerateFiles(&quot;scripts\/&quot;);\n-    char **i;\n-    std::string script;\n-    for (i = files; *i != NULL; i++){\n-        script = *i;\n-        if (!PHYSFS_isDirectory((script_dir+script).c_str()) && !script.compare(script.size()-3, 3, &quot;.py&quot;)){\n-            scriptnames.push_back(script.substr(0,script.size()-3));\n-            ++numScripts;\n-        }\n-    }\n-    PHYSFS_freeList(files);\n+   scriptnames.clear();\n+    numScripts = 0;\n+\n+    \/\/ Human\uff08\u4eba\u9593\u30d7\u30ec\u30a4\u30e4\u30fc\uff09\n+    scriptnames.push_back(&quot;Human&quot;);\n+    ++numScripts;\n+\n+    \/\/ C++ AI \u3092\u56fa\u5b9a\u3067\u8ffd\u52a0\n+    scriptnames.push_back(&quot;balderai&quot;);\n+    scriptnames.push_back(&quot;randomai&quot;);\n+    scriptnames.push_back(&quot;simple_aimer&quot;);\n+    scriptnames.push_back(&quot;aggressive&quot;);\n+    scriptnames.push_back(&quot;defensive&quot;);\n+    scriptnames.push_back(&quot;sniperai&quot;);\n+    numScripts += 6;\n+    scriptnames.push_back(&quot;wallfollower&quot;);\n+    ++numScripts;\n+    scriptnames.push_back(&quot;default&quot;);\n+    ++numScripts;\n }<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">vi SConstruct<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>includepath = [&#39;\/usr\/include\/python2.7&#39;,&#39;include&#39;]\nincludepath = [&#39;include&#39;]\n\nlibs = Split(&#39;guichan_sdl guichan SDL SDL_image SDL_mixer SDL_gfx python2.7 physfs&#39;)\nlibs = Split(&#39;guichan_sdl guichan SDL SDL_image SDL_mixer SDL_gfx physfs&#39;)\n\nSConscript(&#39;bin\/scripts\/test\/SConscript&#39;)\n#SConscript(&#39;bin\/scripts\/test\/SConscript&#39;)\n<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">scons -c<br \/>scons<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<p>Views: 0<\/p>","protected":false},"excerpt":{"rendered":"<p>\u25ce\u3000Balder 2D\u3000\u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0 (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd) \u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 \u30b2\u30fc\u30e0\u8a73\u7d30 https:\/\/sourceforge.net\/projects\/balder \u8d77\u52d5 &hellip; <a href=\"https:\/\/nsb.homeip.net\/wp\/?p=9095\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9095","post","type-post","status-publish","format-standard","hentry","category-1"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u25ce Balder 2D \u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0 (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd) \u30b9\u30af\u30ea\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"\u5948\u9162\u7f8e\"\/>\n\t<meta name=\"google-site-verification\" content=\"bbhrVUvbiKMatIsd8BdFMmYyNw5j1Zn7vp6S3qszbpY\" \/>\n\t<meta name=\"keywords\" content=\"\u672a\u5206\u985e\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/nsb.homeip.net\/wp\/?p=9095\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ja_JP\" \/>\n\t\t<meta property=\"og:site_name\" content=\"\u5948\u9162\u7f8e\u306e\u90e8\u5c4b\u3000\u5225\u9928 \u2022 another NSB&#039;s room Blog [http:\/\/www.amy.hi-ho.ne.jp\/masuda\/]\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D \u2022 \u5948\u9162\u7f8e\u306e\u90e8\u5c4b \u5225\u9928\" \/>\n\t\t<meta property=\"og:description\" content=\"\u25ce Balder 2D \u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0 (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd) \u30b9\u30af\u30ea\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/nsb.homeip.net\/wp\/?p=9095\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2026\/05\/bunner.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2026\/05\/bunner.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"200\" \/>\n\t\t<meta property=\"og:image:height\" content=\"40\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-10-03T14:22:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-10-03T15:37:41+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@nasubi_g400\" \/>\n\t\t<meta name=\"twitter:title\" content=\"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D \u2022 \u5948\u9162\u7f8e\u306e\u90e8\u5c4b \u5225\u9928\" \/>\n\t\t<meta name=\"twitter:description\" content=\"\u25ce Balder 2D \u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0 (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd) \u30b9\u30af\u30ea\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@nasubi_g400\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2026\/05\/bunner.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#blogposting\",\"name\":\"\\u96fb\\u5b50\\u8f9e\\u66f8Brain\\u3092\\u3044\\u3058\\u308b (13) Brainux\\u3067\\u30b2\\u30fc\\u30e0\\u3092\\u6539\\u9020\\u3057\\u3066\\u904a\\u3076 (1) Balder 2D \\u2022 \\u5948\\u9162\\u7f8e\\u306e\\u90e8\\u5c4b \\u5225\\u9928\",\"headline\":\"\\u96fb\\u5b50\\u8f9e\\u66f8Brain\\u3092\\u3044\\u3058\\u308b (13) Brainux\\u3067\\u30b2\\u30fc\\u30e0\\u3092\\u6539\\u9020\\u3057\\u3066\\u904a\\u3076 (1) Balder 2D\",\"author\":{\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?author=2#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/scrot_20260430-223146_854x480.png\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095\\\/#articleImage\",\"width\":854,\"height\":480},\"datePublished\":\"2026-10-03T23:22:15+09:00\",\"dateModified\":\"2026-10-04T00:37:41+09:00\",\"inLanguage\":\"ja\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#webpage\"},\"articleSection\":\"\\u672a\\u5206\\u985e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?cat=1#listItem\",\"name\":\"\\u672a\\u5206\\u985e\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?cat=1#listItem\",\"position\":2,\"name\":\"\\u672a\\u5206\\u985e\",\"item\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?cat=1\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#listItem\",\"name\":\"\\u96fb\\u5b50\\u8f9e\\u66f8Brain\\u3092\\u3044\\u3058\\u308b (13) Brainux\\u3067\\u30b2\\u30fc\\u30e0\\u3092\\u6539\\u9020\\u3057\\u3066\\u904a\\u3076 (1) Balder 2D\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#listItem\",\"position\":3,\"name\":\"\\u96fb\\u5b50\\u8f9e\\u66f8Brain\\u3092\\u3044\\u3058\\u308b (13) Brainux\\u3067\\u30b2\\u30fc\\u30e0\\u3092\\u6539\\u9020\\u3057\\u3066\\u904a\\u3076 (1) Balder 2D\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?cat=1#listItem\",\"name\":\"\\u672a\\u5206\\u985e\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/#person\",\"name\":\"\\u5948\\u9162\\u7f8e\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/84fe91042a353c1bc14bc33a2018173e02ef4f4284b1073a1b3f0b9a2b371462?s=96&d=retro&r=g\",\"width\":96,\"height\":96,\"caption\":\"\\u5948\\u9162\\u7f8e\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?author=2#author\",\"url\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?author=2\",\"name\":\"\\u5948\\u9162\\u7f8e\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/84fe91042a353c1bc14bc33a2018173e02ef4f4284b1073a1b3f0b9a2b371462?s=96&d=retro&r=g\",\"width\":96,\"height\":96,\"caption\":\"\\u5948\\u9162\\u7f8e\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#webpage\",\"url\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095\",\"name\":\"\\u96fb\\u5b50\\u8f9e\\u66f8Brain\\u3092\\u3044\\u3058\\u308b (13) Brainux\\u3067\\u30b2\\u30fc\\u30e0\\u3092\\u6539\\u9020\\u3057\\u3066\\u904a\\u3076 (1) Balder 2D \\u2022 \\u5948\\u9162\\u7f8e\\u306e\\u90e8\\u5c4b \\u5225\\u9928\",\"description\":\"\\u25ce Balder 2D \\u7121\\u91cd\\u529b\\u4e0b\\u306e\\u4e8c\\u6b21\\u5143\\u30b7\\u30e5\\u30fc\\u30c6\\u30a3\\u30f3\\u30b0\\u30b2\\u30fc\\u30e0 (\\u6539\\u9020\\u7248\\u306a\\u3089Trixie\\u3067\\u3082\\u5b9f\\u884c\\u306f\\u53ef\\u80fd) \\u30b9\\u30af\\u30ea\",\"inLanguage\":\"ja\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?p=9095#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?author=2#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/?author=2#author\"},\"datePublished\":\"2026-10-03T23:22:15+09:00\",\"dateModified\":\"2026-10-04T00:37:41+09:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/#website\",\"url\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/\",\"name\":\"\\u5948\\u9162\\u7f8e\\u306e\\u90e8\\u5c4b \\u5225\\u9928\",\"alternateName\":\"\\u5948\\u9162\\u7f8e\\u306e\\u90e8\\u5c4b\",\"description\":\"another NSB's room Blog [http:\\\/\\\/www.amy.hi-ho.ne.jp\\\/masuda\\\/]\",\"inLanguage\":\"ja\",\"publisher\":{\"@id\":\"https:\\\/\\\/nsb.homeip.net\\\/wp\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D \u2022 \u5948\u9162\u7f8e\u306e\u90e8\u5c4b \u5225\u9928","description":"\u25ce Balder 2D \u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0 (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd) \u30b9\u30af\u30ea","canonical_url":"https:\/\/nsb.homeip.net\/wp\/?p=9095","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"\u672a\u5206\u985e","webmasterTools":{"google-site-verification":"bbhrVUvbiKMatIsd8BdFMmYyNw5j1Zn7vp6S3qszbpY","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#blogposting","name":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D \u2022 \u5948\u9162\u7f8e\u306e\u90e8\u5c4b \u5225\u9928","headline":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D","author":{"@id":"https:\/\/nsb.homeip.net\/wp\/?author=2#author"},"publisher":{"@id":"https:\/\/nsb.homeip.net\/wp\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2025\/12\/scrot_20260430-223146_854x480.png","@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095\/#articleImage","width":854,"height":480},"datePublished":"2026-10-03T23:22:15+09:00","dateModified":"2026-10-04T00:37:41+09:00","inLanguage":"ja","mainEntityOfPage":{"@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#webpage"},"isPartOf":{"@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#webpage"},"articleSection":"\u672a\u5206\u985e"},{"@type":"BreadcrumbList","@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/nsb.homeip.net\/wp\/#listItem","position":1,"name":"Home","item":"https:\/\/nsb.homeip.net\/wp\/","nextItem":{"@type":"ListItem","@id":"https:\/\/nsb.homeip.net\/wp\/?cat=1#listItem","name":"\u672a\u5206\u985e"}},{"@type":"ListItem","@id":"https:\/\/nsb.homeip.net\/wp\/?cat=1#listItem","position":2,"name":"\u672a\u5206\u985e","item":"https:\/\/nsb.homeip.net\/wp\/?cat=1","nextItem":{"@type":"ListItem","@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#listItem","name":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D"},"previousItem":{"@type":"ListItem","@id":"https:\/\/nsb.homeip.net\/wp\/#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#listItem","position":3,"name":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D","previousItem":{"@type":"ListItem","@id":"https:\/\/nsb.homeip.net\/wp\/?cat=1#listItem","name":"\u672a\u5206\u985e"}}]},{"@type":"Person","@id":"https:\/\/nsb.homeip.net\/wp\/#person","name":"\u5948\u9162\u7f8e","image":{"@type":"ImageObject","@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/84fe91042a353c1bc14bc33a2018173e02ef4f4284b1073a1b3f0b9a2b371462?s=96&d=retro&r=g","width":96,"height":96,"caption":"\u5948\u9162\u7f8e"}},{"@type":"Person","@id":"https:\/\/nsb.homeip.net\/wp\/?author=2#author","url":"https:\/\/nsb.homeip.net\/wp\/?author=2","name":"\u5948\u9162\u7f8e","image":{"@type":"ImageObject","@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/84fe91042a353c1bc14bc33a2018173e02ef4f4284b1073a1b3f0b9a2b371462?s=96&d=retro&r=g","width":96,"height":96,"caption":"\u5948\u9162\u7f8e"}},{"@type":"WebPage","@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#webpage","url":"https:\/\/nsb.homeip.net\/wp\/?p=9095","name":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D \u2022 \u5948\u9162\u7f8e\u306e\u90e8\u5c4b \u5225\u9928","description":"\u25ce Balder 2D \u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0 (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd) \u30b9\u30af\u30ea","inLanguage":"ja","isPartOf":{"@id":"https:\/\/nsb.homeip.net\/wp\/#website"},"breadcrumb":{"@id":"https:\/\/nsb.homeip.net\/wp\/?p=9095#breadcrumblist"},"author":{"@id":"https:\/\/nsb.homeip.net\/wp\/?author=2#author"},"creator":{"@id":"https:\/\/nsb.homeip.net\/wp\/?author=2#author"},"datePublished":"2026-10-03T23:22:15+09:00","dateModified":"2026-10-04T00:37:41+09:00"},{"@type":"WebSite","@id":"https:\/\/nsb.homeip.net\/wp\/#website","url":"https:\/\/nsb.homeip.net\/wp\/","name":"\u5948\u9162\u7f8e\u306e\u90e8\u5c4b \u5225\u9928","alternateName":"\u5948\u9162\u7f8e\u306e\u90e8\u5c4b","description":"another NSB's room Blog [http:\/\/www.amy.hi-ho.ne.jp\/masuda\/]","inLanguage":"ja","publisher":{"@id":"https:\/\/nsb.homeip.net\/wp\/#person"}}]},"og:locale":"ja_JP","og:site_name":"\u5948\u9162\u7f8e\u306e\u90e8\u5c4b\u3000\u5225\u9928 \u2022 another NSB's room Blog [http:\/\/www.amy.hi-ho.ne.jp\/masuda\/]","og:type":"article","og:title":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D \u2022 \u5948\u9162\u7f8e\u306e\u90e8\u5c4b \u5225\u9928","og:description":"\u25ce Balder 2D \u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0 (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd) \u30b9\u30af\u30ea","og:url":"https:\/\/nsb.homeip.net\/wp\/?p=9095","og:image":"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2026\/05\/bunner.jpg","og:image:secure_url":"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2026\/05\/bunner.jpg","og:image:width":200,"og:image:height":40,"article:published_time":"2026-10-03T14:22:15+00:00","article:modified_time":"2026-10-03T15:37:41+00:00","twitter:card":"summary_large_image","twitter:site":"@nasubi_g400","twitter:title":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D \u2022 \u5948\u9162\u7f8e\u306e\u90e8\u5c4b \u5225\u9928","twitter:description":"\u25ce Balder 2D \u7121\u91cd\u529b\u4e0b\u306e\u4e8c\u6b21\u5143\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b2\u30fc\u30e0 (\u6539\u9020\u7248\u306a\u3089Trixie\u3067\u3082\u5b9f\u884c\u306f\u53ef\u80fd) \u30b9\u30af\u30ea","twitter:creator":"@nasubi_g400","twitter:image":"https:\/\/nsb.homeip.net\/wp\/wp-content\/uploads\/2026\/05\/bunner.jpg"},"aioseo_meta_data":{"post_id":"9095","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-10-03 14:12:19","updated":"2026-10-03 16:11:09","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/nsb.homeip.net\/wp\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/nsb.homeip.net\/wp\/?cat=1\" title=\"\u672a\u5206\u985e\">\u672a\u5206\u985e<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/nsb.homeip.net\/wp\/"},{"label":"\u672a\u5206\u985e","link":"https:\/\/nsb.homeip.net\/wp\/?cat=1"},{"label":"\u96fb\u5b50\u8f9e\u66f8Brain\u3092\u3044\u3058\u308b (13) Brainux\u3067\u30b2\u30fc\u30e0\u3092\u6539\u9020\u3057\u3066\u904a\u3076 (1) Balder 2D","link":"https:\/\/nsb.homeip.net\/wp\/?p=9095"}],"_links":{"self":[{"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=\/wp\/v2\/posts\/9095","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9095"}],"version-history":[{"count":4,"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=\/wp\/v2\/posts\/9095\/revisions"}],"predecessor-version":[{"id":9113,"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=\/wp\/v2\/posts\/9095\/revisions\/9113"}],"wp:attachment":[{"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9095"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9095"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nsb.homeip.net\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9095"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}