Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Topics - DBoyWheeler

#1
Rejoice with me, for a game that I've long wanted to complete making has finally been completed!

Sarimento on Hyperborean Island



Main Download link: https://gamejolt.com/games/SarimentoAGS/909038

A game made for, and about, Sarimento (a friend on Gaia Online).  So it's meant to be a gift game, but others can play it too!

Here's the 411:
Spoiler
[close]

The titular hero, Sarimento, crash-lands on the wintry Hyperborean Island.  But under the calm exterior, the people are in fear.

Spoiler


[close]

Help the hero restore the people's faith in humanity by doing some small (and sometimes large) favors, and eventually finding the cause of their troubles.

This is a verb-coin game.  Left click has the hero walk or, if the cursor is on a spot (character, hotspot, etc.) bring up the verb-coin interface (or, if he's got an item, use the item in some way).  Right click brings up the Inventory GUI, or if he has an item active already, get the cursor back to the regular cursor.  Click the computer button on the top right of the screen to bring up the system menu to change volume and character speed, save, load, etc.

Full-screen mode is recommended for this game.
#2
Something really screwy is going on with my Inventory interface.

So, when I go into my inventory (and I think I fixed the code to make it select the item when I left-click), it doesn't always pick the item.  I practically have to pixel-hunt to find the "hotspot" of the item to make the action text show the item name and then it'll become active inventory when I click it.

I'd show the code snippet if I knew what code snippet to pick.  (It's my game with the special verb-coin interface I've posted of in the past.)
#3
I've been listening to YouTuber "The Living Tombstone" some more (after all, his song on FNaF1 became the end credits theme to the Five Nights at Freddy's movie).

And a thought came to me--what if we could get The Living Tombstone to make some fun songs for some future adventure games with AGS?  That'd just be awesomesauce!
#4
Hi.

Aside from the verb coin, I had in mind making a custom dialog GUI for doing dialogues.

The graphics are a main field.


And an up arrow and down arrow, if there are sufficient dialog topics to warrant going up and down.


How can I set it so the field only appears when having dialogue, and the arrows only appear when there needs to be scrolling?  I know there's a regular dialogue thing in AGS, but I'm wondering if it is possible to make a custom dialogue thing.
#5
General Discussion / Needing fillings soon.
Mon 16/10/2023 15:45:53
Fan-freakin'-tastic.

Found out there was a small patch of decay between two of my teeth (thankfully they caught it just in time).  But come November, I'll be needing fillings.

Yeah, my luck had to run out at some point.
#6
So I saw the newer verb coin set up when you start making a new game.  But the way it set up with directions (North, West, etc.) might not work well with the verb coin I want to use.

Here's what I plan as a set up.

(I've made separate buttons with a snowflake style background--the bottom three are special buttons.)

And I've already commented out the stuff in the verb coin code for directions.
Spoiler
Code: ags
// Script header for VerbCoin script module
#define VERBCOIN_DEFAULT_RADIUS 38
#define VERBCOIN_DEFAULT_BACKGROUND_TRANSPARENCY 80
#define VERBCOIN_DEFAULT_BACKGROUND_COLOR 32089
#define VERBCOIN_DEFAULT_BORDER_COLOR 19248
#define VERBCOIN_DEFAULT_BORDER_WIDTH 1

#ifdef SCRIPT_API_v3507
#define SCREEN_WIDTH Screen.Width
#define SCREEN_HEIGHT Screen.Height
#endif
#ifndef SCRIPT_API_v3507
#define SCREEN_WIDTH System.ViewportWidth
#define SCREEN_HEIGHT System.ViewportHeight
#endif

//enum VerbCoinPosition {
//  eVerbCoinPositionNorth,
//  eVerbCoinPositionEast,
//  eVerbCoinPositionSouth,
//  eVerbCoinPositionWest
//};

struct VerbCoin {
  import static attribute int Radius;
  import static attribute int BackgroundTransparency;
  import static attribute int BackgroundColor;
  import static attribute int BorderColor;
  import static attribute int BorderWidth;
  import static function OnClick(GUIControl* control, MouseButton button);
  import static function RegisterButton(GUIControl* control, VerbCoinPosition position, CursorMode mode, String verbtext);
  import static attribute GUI* InterfaceGui;
  import static attribute GUI* InventoryGui;
  import static attribute Label* ActionLabel;
  import static function Enable();
  import static function Disable();
  import static function IsEnabled();
  import static function Open();
  import static function Close();
  import static function IsOpen();
  import static function CleanUp();
  import static attribute bool ButtonAutoDisable;
};
[close]
And
Spoiler
Code: ags
// sprite for the GUI background
DynamicSprite* sprite;

// GUI to use for the verbcoin
GUI* interface;

// inventory GUI to use
GUI* interface_inv;

// label to use for text actions
Label* action_label;

// default settings
int radius = VERBCOIN_DEFAULT_RADIUS;
int background_color = VERBCOIN_DEFAULT_BACKGROUND_COLOR;
int background_transparency = VERBCOIN_DEFAULT_BACKGROUND_TRANSPARENCY;
int border_color = VERBCOIN_DEFAULT_BORDER_COLOR;
int border_width = VERBCOIN_DEFAULT_BORDER_WIDTH;
int redraw = false;

// track where the interface was opened from
int context_x;
int context_y;
String context_text;

// map GUI controls against cursor modes
int modemap[];

// map GUI controls against text descrptions
String actionmap[];

// enable click handling and action label updates
bool enabled = false;

// whether buttons will be disabled if clicking them would result in an unhandled event
bool button_auto_disable = false;

function Clamp(static Maths, int value, int min, int max)
{
  if (value < min)
  {
    value = min;
  }

  if (value > max)
  {
    value = max;
  }

  return value;
}

function Min(static Maths, int value1, int value2)
{
  if (value1 > value2)
  {
    return value2;
  }

  return value1;
}

function set_buttons_enabled(bool state)
{
  for (int i; i < interface.ControlCount; i ++)
  {
    if (interface.Controls[i].AsButton != null)
    {
      interface.Controls[i].Enabled = state;
    }
  }
}

void set_Radius(static VerbCoin, int newradius)
{
  if (newradius < 1)
  {
    newradius = 1;
  }

  if (newradius != radius)
  {
    radius = newradius;
    redraw = true;
  }
}

int get_Radius(static VerbCoin)
{
  return radius;
}

void set_BackgroundTransparency(static VerbCoin, int transparency)
{
  transparency = Maths.Clamp(transparency, 0, 100);

  if (transparency != background_transparency)
  {
    background_transparency = transparency;
    redraw = true;
  }
}

int get_BackgroundTransparency(static VerbCoin)
{
  return background_transparency;
}

void set_BackgroundColor(static VerbCoin, int color)
{
  color = Maths.Clamp(color, 0, 65535);

  if (color != background_color)
  {
    background_color = color;
    redraw = true;
  }
}

int get_BackgroundColor(static VerbCoin)
{
  return background_color;
}

void set_BorderColor(static VerbCoin, int color)
{
  color = Maths.Clamp(color, 0, 65535);

  if (color != border_color)
  {
    border_color = color;
    redraw = true;
  }
}

int get_BorderColor(static VerbCoin)
{
  return border_color;
}

void set_BorderWidth(static VerbCoin, int width)
{
  width = Maths.Clamp(width, 0, radius);

  if (width != border_width)
  {
    border_width = width;
    redraw = true;
  }
}

int get_BorderWidth(static VerbCoin)
{
  return border_width;
}

static function VerbCoin::OnClick(GUIControl* control, MouseButton button)
{
  if (interface != null)
  {
    interface.Visible = false;
  }

  if (modemap != null && (button == eMouseLeft || button == eMouseRight))
  {
    Room.ProcessClick(context_x, context_y, modemap[control.ID]);
  }
}

function place_button(GUIControl* control, VerbCoinPosition position)
{
  float edge;

  if (position == eVerbCoinPositionNorth || position == eVerbCoinPositionSouth)
  {
    edge = IntToFloat(control.Width) / 2.0;
  }
  else
  {
    edge = IntToFloat(control.Height) / 2.0;
  }

  float squared = Maths.RaiseToPower(IntToFloat(radius), 2.0) - Maths.RaiseToPower(edge, 2.0);

  if (squared < 0.0)
  {
    squared = 0.0;
  }

  float offset = Maths.Sqrt(squared);

  //if (position == eVerbCoinPositionNorth)
  //{
  //  control.X = radius - FloatToInt(edge);
  //  control.Y = radius - FloatToInt(offset, eRoundDown);
  //}
  //else if (position == eVerbCoinPositionEast)
  //{
  //  control.X = radius + FloatToInt(offset, eRoundUp) - control.Width;
  //  control.Y = radius - FloatToInt(edge);
  //}
  //else if (position == eVerbCoinPositionSouth)
  //{
  //  control.X = radius - FloatToInt(edge);
  //  control.Y = radius + FloatToInt(offset, eRoundUp) - control.Height;
  //}
  //else if (position == eVerbCoinPositionWest)
  //{
  //  control.X = radius - FloatToInt(offset, eRoundDown);
  //  control.Y = radius - FloatToInt(edge);
  //}
}

//static function VerbCoin::RegisterButton(GUIControl* control, VerbCoinPosition position, CursorMode mode, String action)
//{
//  if (control.OwningGUI == interface && control.AsButton != null)
//  {
//    place_button(control, position);
//    modemap[control.ID] = mode;
//    actionmap[control.ID] = action;
//    control.Visible = true;
//  }
//}

function render()
{
  // resize the GUI to fit the sprite
  int gui_size = radius * 2;
  gui_size = Maths.Min(gui_size, SCREEN_HEIGHT);
  gui_size = Maths.Min(gui_size, SCREEN_WIDTH);
  gui_size ++;
  interface.Width = gui_size;
  interface.Height = gui_size;

  DynamicSprite* background = DynamicSprite.Create(interface.Width, interface.Height, true);
  DrawingSurface* surface;

  // redraw the sprite
  surface = background.GetDrawingSurface();
  surface.DrawingColor = border_color;
  surface.DrawCircle(radius, radius, radius);
  surface.DrawingColor = background_color;
  surface.DrawCircle(radius, radius, radius - border_width);
  surface.Release();

  sprite = DynamicSprite.Create(interface.Width, interface.Height, true);
  surface = sprite.GetDrawingSurface();
  surface.DrawImage(0, 0, background.Graphic, background_transparency);
  background.Delete();
  surface.Release();
  interface.BackgroundGraphic = sprite.Graphic;
}

void set_InterfaceGui(static VerbCoin, GUI* interface_gui)
{
  interface = interface_gui;

  for (int i; i < interface.ControlCount; i ++)
  {
    if (interface.Controls[i].AsButton != null)
    {
      interface.Controls[i].Visible = false;
    }
  }

  modemap = new int[interface.ControlCount];
  actionmap = new String[interface.ControlCount];
  enabled = true;
  render();
}

GUI* get_InterfaceGui(static VerbCoin)
{
  return interface;
}

void set_InventoryGui(static VerbCoin, GUI* inventory_gui)
{
  interface_inv = inventory_gui;
}

GUI* get_InventoryGui(static VerbCoin)
{
  return interface_inv;
}

void set_ActionLabel(static VerbCoin, Label* label)
{
  action_label = label;
  action_label.Text = "";
}

Label* get_ActionLabel(static VerbCoin)
{
  return action_label;
}

static function VerbCoin::Enable()
{
  enabled = true;
  set_buttons_enabled(true);
}

static function VerbCoin::Disable()
{
  enabled = false;
  set_buttons_enabled(false);
}

static function VerbCoin::IsEnabled()
{
  return enabled;
}

static function VerbCoin::Open()
{
  if (interface != null)
  {
    interface.Visible = true;
  }
}

static function VerbCoin::Close()
{
  if (interface != null)
  {
    interface.Visible = false;
  }
}

static function VerbCoin::IsOpen()
{
  return interface != null && interface.Visible;
}

static function VerbCoin::CleanUp() {
  if (sprite != null) sprite.Delete();
}

void set_ButtonAutoDisable(static VerbCoin, bool autodisable)
{
  button_auto_disable = autodisable;
}

bool get_ButtonAutoDisable(static VerbCoin)
{
  return button_auto_disable;
}

function on_mouse_click(MouseButton button)
{
  if (interface == null || !enabled)
  {
    // don't do anything if GUI isn't set or is disabled
  }
  else if (button == eMouseLeft)
  {
    if (GetLocationType(mouse.x, mouse.y) != eLocationNothing)
    {
      if (player.ActiveInventory != null)
      {
        Room.ProcessClick(mouse.x, mouse.y, eModeUseinv);
      }
      else if (interface.Visible)
      {
        interface.Visible = false;
      }
      else if (interface_inv != null && interface_inv.Visible)
      {
        interface_inv.Visible = false;
      }
      else if (Character.GetAtScreenXY(mouse.x, mouse.y) != player)
      {
        context_x = mouse.x;
        context_y = mouse.y;
        interface.X = Maths.Clamp(context_x - radius, 0, SCREEN_WIDTH - interface.Width);
        interface.Y = Maths.Clamp(context_y - radius, 0, SCREEN_HEIGHT - interface.Height);

        if (button_auto_disable)
        {
          for (int i; i < interface.ControlCount; i ++)
          {
            if (interface.Controls[i].AsButton != null)
            {
              interface.Controls[i].Enabled = IsInteractionAvailable(context_x, context_y, modemap[interface.Controls[i].ID]);
            }
          }
        }

        interface.Visible = true;
      }
    }
    // close windows or unset the active inventory item
    else if (interface.Visible)
    {
      interface.Visible = false;
    }
    else if (interface_inv != null && interface_inv.Visible)
    {
      interface_inv.Visible = false;
    }
    else if (player.ActiveInventory != null)
    {
      player.ActiveInventory = null;
    }
    else
    {
      // ...except when there is no nothing to deselect or close,
      // so just walk to this position
      Room.ProcessClick(mouse.x, mouse.y, eModeWalkto);
    }
  }
  else if (button == eMouseRight)
  {
    // close windows or unset the active inventory item
    if (interface.Visible)
    {
      interface.Visible = false;
    }
    else if (player.ActiveInventory != null)
    {
      player.ActiveInventory = null;
    }
    else if (interface_inv != null && interface_inv.Visible)
    {
      interface_inv.Visible = false;
    }
    else if (interface_inv != null)
    {
      // ...except when there is no nothing to deselect or close,
      // so a right click is also how the inventory is opened
      interface_inv.Visible = true;
    }
  }
  else if (button == eMouseLeftInv)
  {
    // InventoryItem.GetAtScreenXY could return null here
    // so using game.inv_activated instead is a safer option
    InventoryItem* item = inventory[game.inv_activated];

    if (player.ActiveInventory == null)
    {
      // left click to set active inventory
      player.ActiveInventory = item;
    }
    else if (item.ID != player.ActiveInventory.ID)
    {
      // left click to 'combine' items
      item.RunInteraction(eModeUseinv);
    }
    else if (interface_inv != null)
    {
      // clicking an item on itself closes the inventory window
      // (this is just a shortcut to avoid moving the cursor, as it means
      // you can just double click an item to also close the window)
      interface_inv.Visible = false;
    }
  }
  else if (button == eMouseRightInv)
  {
    // InventoryItem.GetAtScreenXY could return null here
    // so using game.inv_activated instead is a safer option
    InventoryItem* item = inventory[game.inv_activated];

    if (player.ActiveInventory == null && item != null)
    {
      // right click to look at item
      item.RunInteraction(eModeLookat);
    }
    else
    {
      // right click to deselect
      player.ActiveInventory = null;
    }
  }
}

function repeatedly_execute_always()
{
  if (redraw)
  {
    render();
    redraw = false;
  }
}

function repeatedly_execute()
{
  if (interface == null || !enabled)
  {
    // don't do anything if GUI isn't set or is disabled
  }
  else if (player.ActiveInventory == null)
  {
    if (interface.Visible)
    {
      // update text label for verb coin actions
      GUIControl* control = GUIControl.GetAtScreenXY(mouse.x, mouse.y);

      if (action_label == null)
      {
        // pass
      }
      else if (control != null && control.AsButton != null && control.Enabled && context_text != null)
      {
        action_label.Text = String.Format("%s %s", actionmap[control.ID], context_text);
      }
      else if (context_text != null)
      {
        action_label.Text = context_text;
      }
    }
    else if ((interface_inv != null && !interface_inv.Visible) || GetLocationType(mouse.x, mouse.y) == eLocationNothing)
    {
      // update regular text label
      context_text = Game.GetLocationName(mouse.x, mouse.y);

      if (action_label != null)
      {
        action_label.Text = context_text;
      }
    }
  }
  else
  {
    if (interface_inv != null && interface_inv.Visible && GUI.GetAtScreenXY(mouse.x, mouse.y) != interface_inv)
    {
      // close inventory window once the cursor leaves
      interface_inv.Visible = false;
    }

    // update text label for 'combining' items
    String location = Game.GetLocationName(mouse.x, mouse.y);
    InventoryItem *i = InventoryItem.GetAtScreenXY(mouse.x, mouse.y);

    if ((i != null && i.ID == player.ActiveInventory.ID) || location == "")
    {
      location = "...";
    }

    if (action_label != null)
    {
      action_label.Text = String.Format("Use %s with %s", player.ActiveInventory.Name, location);
    }
  }
}

function on_event(EventType event, int data)
{
  if (event == eEventLeaveRoom && interface != null)
  {
    // hide interface when changing rooms
    interface.Visible = false;
  }
  else if (event == eEventGUIMouseDown &&
      interface_inv != null &&
      data == interface_inv.ID &&
      InventoryItem.GetAtScreenXY(mouse.x, mouse.y) == null)
  {
    // handle clicks in the inventory area that are not on an inventory item
    GUIControl* control = GUIControl.GetAtScreenXY(mouse.x, mouse.y);

    if (control == null || control.AsInvWindow == null)
    {
      // pass
    }
    else if (player.ActiveInventory != null)
    {
      player.ActiveInventory = null;
    }
    else
    {
      interface_inv.Visible = false;
    }
  }
}
[close]

What else do I need to change in the verb coin code to make my custom-made verb coin work?  (Once I know this part, I'll post the lines in the global script and ask what changes need to be there as well.)
#7
I stumbled onto this a while back, and figured this would be a great group to be in alongside this one.

There is an Adventure Game Studio group in GameJolt, so if there are members here who are also on GameJolt, here is the link:
https://gamejolt.com/c/AGS-twxrcj
#8
I wanted to mention to you a lesser known first-person adventure game called "Dare to Dream".  And it is really bizarre.

Here are videos of a playthrough of the three volumes (parts, episodes, whatever) of the game.

Volume 1: In a Darkened Room https://www.youtube.com/watch?v=fyo22H2Liuk
Volume 2: In Search of the Beast https://www.youtube.com/watch?v=bzgqnx8VXi8
Volume 3: Christian's Lair https://www.youtube.com/watch?v=kGuxraCjrOQ

(Don't let the name "Christian" fool you.  He is the main antagonist, and a demon.  In fact, Volume 3 has it look like you're in a version of hell itself!)

Like I said, bizarre.  And this game was created by the same dude who'd later go on to create Jazz Jackrabbit!
#9
I had this random thought for those working on AGS games...

Wouldn't it be awesomesauce if Yuzo Koshiro (yes, THAT Yuzo Koshiro) did music for an AGS game?
#10
One of my friends started a Discord chat that is a tribute to Humongous Entertainment--the company that made Sly Fox, Freddie Fish, Putt-Putt... basically the kid-friendly point n click adventures.

https://discord.gg/CGy36j3VSc

Any fellow AGS friends (or adventure game fans in general) interested in joining?
#11
I was considering posting this in Adventure game themed section, since it's related to the Quest for Glory series, but had my doubts, so I posted it here.

I just the other day finished a parody of "You're a Mean One, Mr. Grinch" that was Quest for Glory themed.  I posted it in the Quest for Glory groups (and a group of Sierra games in general), as well as my FurAffinity page, and thought I'd share it here.

Anyone want to make an attempt of singing and recording the song?

**
You're a mean one, Ad Avis.
You really are a fiend!
You're an Antwerp full of feces
Your complection's like a spleen
Ad Avis...
I wouldn't blame you if you're showering with Khaveen!

You're a foul one, Ad Avis.
And your odor's awful too!
You make ghouls tremble in fear
And the other monsters too
Ad Avis...
Your soul is centuries old Jackalman doo!

You're a bully, Ad Avis.
Your skin is like a newt!
Your obsession with getting Iblis
Is really, really moot
Ad Avis...
You make a Terrorsaurus with a bad indigestion attack look cute!

You're a vile one, Ad Avis.
I really hate your gut!
When the Hero gets close to you
He is gonna kick your butt
Ad Avis...
The three words that'll describe your fate are, and I quote:
Split, splat, splut!
#12
To cat, the admin of this subforum, you can go ahead and lock this topic: https://www.adventuregamestudio.co.uk/forums/index.php?topic=58502.0

As this post here is meant to be a sequel to it.

To everyone here:
I plan to reopen the Sarimento project in the New Year.

See, this evening (Oct. 31st), I had a bit of a chat with Scavenger in Discord.  And he/she (I forget Scavenger's gender) gave me some pointers to how to go about things without being overwhelmed.

Yeah, I guess I was being a bit of an overachiever, so that's what probably got me discouraged.

But when the new year approaches, I'll do an alpha build--if anything else, get a proof of concept so hopefully others might consider helping in fleshing it out.

I'm delaying till the new year because I want to take care of other projects (art, writing, and such), but I do want to revive the project.

Yep, in the new year, I'm going to say to my Sarimento project: "Wise fwom yo gwave!"

So... just wanted to let you know.
#13
I finally see I'm never going to finish my current AGS project (it was one of those games intended to be for, and about, a friend).

If I had people to help me, I would've finished this game years ago.  But it's not gonna be the case.

So (at least for now), I've decided to cancel the project.

Perhaps someday, I'll do another post in Recruitment, but for now, I need to move on.
#14
Coloring Ball: Monster Egg Discovered

A group of explorers have returned and found a strange egg belonging to some large mythical creature.

What do you imagine it looks like?



Pick one of the egg-shapes and decide what the monster egg might be like.

You may:
-Color the Outlines
-Submit multiple entries
-Use as many colors as you want.

Results

Trophies:
1st Place Sinitrena
2nd Place Klatuu
3rd Place ToeKnee, by default (even though he didn't stay within the shape, I didn't want the trophy to go to waste.)

(I know, the shapes are kind of big, but I didn't want the shapes to be too small.)
#15
A random thought had come to me.

What if Willy Beamish (a lesser known adventure game character) visited Reality-on-the-Norm?  Just a random thought, but perhaps something to get those ideas going.
#16
Even though the Genre Shift theme in MAGS is long past, it still has my gears turning...

In fact, that could be a great "sub-section" for the Adventure Related Talk & Chat.  Like, if the adventure game series were genre shifted to other game genres, or other game genres (like platformers, etc.) got genre-shifted to point n click adventure games.

Here's one to start things out... Sonic the Hedgehog... be it the official games, fan games, SatAM, AoSTH, Sonic Underground (some actually like that), and so forth.

How would you imagine it genre-shifted into a point 'n' click adventure?

To start out with, the first game in Master System/Game Gear.  How could you imagine it as a point'n'click adventure?  I mean, unlike the 16-bit counterpart on the Genesis (Mega Drive in Japan and Europe), the Chaos Emeralds were lying out in the stages, so I could see possible adventure game potential in that (solving a puzzle or problem to reach each one).

Any input on the thought?  Again, a "genre-shift" sub-section for the Adventure Related Talk & Chat could definitely get the gears going for discussion in the forum, and I thought this'd be a good way to get things started.
#17
I wasn't sure whether or not this'd fit in the "Adventure Related Talk & Chat" section, so I played it safe and posted it here.

But, as I mentioned in "Offer Your Services", I hope to enter into the world of freelance copywriting, especially copywriting for games (AGS or otherwise).  But I don't have any major games under my belt--commercial or otherwise.

So, I just wanted your opinion on this... should I use some of my past MAGS entries as practice?  Maybe some of you guys have some games I could use as practice for copywriting an advertisement for?

I'm just asking.  I want to have some good samples so people would know what I can do.  I've taken an online class at Udemy about freelance copywriting, as well as looked at stuff online about copywriting for video games, so I'd like to know your two bits on this.
#18
I'm taking online classes on Udemy.  Three of which are game related, one of them to try to enter into the realm of freelancing.

But this brings me to my point: Are there Udemy classes about Adventure Game Studio?  I've seen a lot of them on the Unity software, but none on AGS.

If not, why not?  I think it'd be cool if there were classes about Adventure Game Studio on the Udemy website.  Maybe Densming, if he's still about, could update his AGS tutorials into a cool online class!  Or another person could make up an Adventure Game Studio class on Udemy--that'd be really cool!
#19
Okay, so last time we had trouble with the Wordpress link.

So... sometime last month, I uploaded my "Momotaro of the Future" story onto the Internet Archive.  Let's hope it works this time.

https://archive.org/details/futuremomotaro
#20
So, I was searching around for adventure-game-related articles on TheGamer.com (since I'm looking for examples for articles to do as a freelancer).  And found this rather interesting article.

https://www.thegamer.com/political-quest-kickstarter/

I don't know if this is AGS, but this game (still in production as of the article's release) is one of those that parodies politics in general.  So even if you yourself aren't into the political stuff, you might get a couple of cheap laughs if/when it comes out.  And it's a point-n-click adventure (especially in the style of LucasArts' games), so how can you go wrong with that?

[Edit] Didn't realize the kickstarter didn't make it.  Still, it was a valiant effort of the guy.
SMF spam blocked by CleanTalk