1190: "Time"

This forum is for the individual discussion thread that goes with each new comic.

Moderators: Moderators General, Prelates, Magistrates

User avatar
mscha
Posts: 6879
Joined: Tue Mar 26, 2013 10:21 pm UTC
Location: NL
Contact:

Re: 1190: "Time"

Postby mscha » Sun Apr 01, 2018 8:51 pm UTC

A bit late, but...

Happy annUNGversery, y'otters!
Image
Spoiler:
Wait for it.

I'll see if I can wake oldpixbot up.

Edit: and I'm pope! Decree: thank the people of The Netherlands for the flowers.
Last edited by mscha on Mon Apr 02, 2018 12:22 am UTC, edited 1 time in total.
List¹ of all Frames of Time and after Time.
New here? Questions? Check the wiki.
Don't worry, feed molpies⁴.
Image
Holy Croce
Default footnotes; standard OTT-np2166m 1.2:
Spoiler:
Image
Image

User avatar
mscha
Posts: 6879
Joined: Tue Mar 26, 2013 10:21 pm UTC
Location: NL
Contact:

1190: "Time" - Time Revisited - np307

Postby mscha » Sun Apr 01, 2018 10:10 pm UTC

IMPROVUNGLY...
Image
Spoiler:
Wait for it.
Replay Time live here!

OTT Time Travel

AUTOMOME wrote:"NINJA IT IN YOUR PRICKLYMOLP" SOUNDS LIKE SLANG FOR TELLING SOMEONE TO CH*RP OFF.

-- posted by oldpixbot

User avatar
ZoomanSP
Posts: 1819
Joined: Sun May 26, 2013 11:23 am UTC
Location: Twelve days north of the Othercomic threads, and a few degrees south of complete insanity. (©yappo)

Re: 1190: "Time"

Postby ZoomanSP » Mon Apr 02, 2018 12:26 am UTC

Wait on.

Image
Spoiler:
Kieryn wrote:They have a culture involving hat wearing. What kind of a collective would come up with such a thing!?
BlitzGirl wrote:I'll get the razor and finish off Occam while we're at it.
ucim / Megan wrote:"It can do whatever it wants. It's the OTT."

User avatar
taixzo
Posts: 1598
Joined: Fri Mar 16, 2012 4:54 am UTC
Location: The Present

Re: 1190: "Time"

Postby taixzo » Mon Apr 02, 2018 1:08 am UTC

ZoomanSP wrote:New OtherComic.


Which can also involve waiting for it.

Image

RSIR
Spoiler:
Screen Shot 2018-04-01 at 9.07.29 PM.png
BlitzGirl the Next
BlitzGirl the Fast
Knight Temporal
Bringer of the Light

Useless utilities: Newpix clock for Mac OS X, Newpix clock for Ubuntu

Sandgarden - a relaxing experience for Time Waiters

Best wishes to GnomeAnne, ColletArrow and january1may! One day you will all join me in the Present!

User avatar
addams
Posts: 9967
Joined: Sun Sep 12, 2010 4:44 am UTC
Location: Oregon Coast: 97444

Re: 1190: "Time"

Postby addams » Mon Apr 02, 2018 4:48 am UTC

I missed the Five Year Page.
Five Years....

Five years ago, I rode a Moto.
I used to ride a Moto, a lot.

I rode in Eastern Europe, England/Ireland (on the Wrong side of the roads),
all over the US and nearly every State in Mexico.

I found this U-Tube Clip. Beware Bad Language
https://www.youtube.com/watch?v=6iay_btGY6I
And; It's long. It reflects what Moto riding was like.

I could Sooo totally relate. I was riveted by the clip.
I remembered how frightening Moto riding can be.

Now, I can not ride a Moto.
Now, I can not walk far.

Now, I get scared listening to Yappo's Music.
https://www.youtube.com/watch?v=ftnCd5lDZjM
https://www.youtube.com/watch?v=Ypr5ggYtKTw

This thread and Yappo's Music are all the excitement I need.
These days, I watch SunSets, MoonRises and Plants Grow.

I've stopped painting.
And; Watching it dry.
It's too much work.
Life is, just, an exchange of electrons; It is up to us to give it meaning.

We are all in The Gutter.
Some of us see The Gutter.
Some of us see The Stars.
by mr. Oscar Wilde.

Those that want to Know; Know.
Those that do not Know; Don't tell them.
They do terrible things to people that Tell Them.

User avatar
BlitzGirl
Posts: 8999
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Both Present and Past...... Schizoblitz: 115/2601 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Mon Apr 02, 2018 7:36 am UTC

Image !
Hi! Thanks for bringing back oldpixbot!
I also want to thank you again for keeping up your viewer and all the saved pix. I use it a seaish amount.

ZoomanSP wrote:New OtherComic.

Treeish! It is possible to navigate to the OTC, of course, through File > Open > C:\ > Bookmarks > Comics > T > i > me or any similar route. Brings up poor jittery 1190. And also, through a molpish coincidence, the game you can play through the menus, Adventure, is shown as ADVENT. It's all RELATED!

I also liked the waiting for the A:\ drive that taixzo pointed out. In fact, I think that calls for ottification...


1975: Right Click

Image

Right-click or use thwapstick (where supported) to save Megan from the keyboard!


Redundant:
Spoiler:
Image


OTTercomic1975.png



OTTercomic1975riverish.png

Keywords: BGUM right click rightclick menu menus navigate hover waiting wait commandment
redundant303.png
You have been eaten by a meowlpy.
redundant303.png (103.9 KiB) Viewed 20954 times
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<-Blog
~.Image~.FAQ->Image

User avatar
Eternal Density
Posts: 5547
Joined: Thu Oct 02, 2008 12:37 am UTC
Contact:

Re: 1190: "Mornington Time"

Postby Eternal Density » Mon Apr 02, 2018 9:09 am UTC

I don't think the thwapstick is supported on Chromebook :(
Play the game of Time! castle.chirpingmustard.com Hotdog Vending Supplier But what is this?
In the Marvel vs. DC film-making war, we're all winners.

User avatar
NoMouse
Posts: 710
Joined: Mon Mar 25, 2013 10:05 pm UTC
Location: Czech Republic

Re: 1190: "Time"

Postby NoMouse » Mon Apr 02, 2018 12:10 pm UTC

taixzo wrote:
ZoomanSP wrote:New OtherComic.


Which can also involve waiting for it.

Image


I read it as "Chirp error!" an thought it was really RELATED.
Time. The final frontier. These are the voyages of Cueball and Megan. Its continuing mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no one has gone before.

User avatar
NoMouse
Posts: 710
Joined: Mon Mar 25, 2013 10:05 pm UTC
Location: Czech Republic

Re: 1190: "Time"

Postby NoMouse » Mon Apr 02, 2018 12:32 pm UTC

Eternal Density wrote:I don't think the thwapstick is supported on Chromebook :(

That's weird. It works in Chrome on my Android phone. Just have to use long click instead of right click. But navigating the submenus on mobile is rather steambottlish, much molpier on desktop.

EDIT: Holy GLR, what did I do? I hit "quote" instead of "edit". :oops:
EDIT2: Removed the unnecessary quote, now we have to live with this doublepost. Sorry.
Last edited by NoMouse on Mon Apr 02, 2018 4:53 pm UTC, edited 2 times in total.
Time. The final frontier. These are the voyages of Cueball and Megan. Its continuing mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no one has gone before.

User avatar
Febrion
Posts: 265
Joined: Wed Apr 10, 2013 3:27 pm UTC
Location: anchored

Re: 1190: "Time"

Postby Febrion » Mon Apr 02, 2018 2:00 pm UTC

I liked the new OTHERCOMIC at first, but then I dug around a bit and found
Spoiler:
"File -> Open -> C:\ -> Bookmarks -> Comics -> T -> i -> me", which links to T** **D. Now I'm sad



404not today



p.p.s. I keep seeing the decree for 5-year reflection, but haven't been able to post anything about it yet (maybe in another 5 years) I like the idea, but don't want to go through that now
Temporal Knight Sir Junction, Lord of the Sawtooth Snap
Time flies like a River, sand flies like a Trebuchét

User avatar
BlitzGirl
Posts: 8999
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Both Present and Past...... Schizoblitz: 115/2601 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Mon Apr 02, 2018 2:46 pm UTC

Oh no!
Deploy emergency ice cream!
Spoiler:
Image
Upon reflection of the reflection, I'm certain that if you want to eventually share on the thread, OTTers will still be here waiting. We've had a sea's worth of practice.
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<-Blog
~.Image~.FAQ->Image

User avatar
balthasar_s
Posts: 2251
Joined: Mon Nov 28, 2011 3:20 pm UTC
Location: secret base on the Moon
Contact:

Re: 1190: "Time"; mustard in the sky!

Postby balthasar_s » Mon Apr 02, 2018 2:58 pm UTC

balthasar_s wrote:I'm now in a place where I don't have any my own computer. I wanted to try Molpy Up on my sister's computer, with Windows XP.
While installing pygame I received this nice greeting:
[...]
I don't really know what went wrong here. Did not try to find out.

I like the new something.
On the same computer I can run the game with no problems in Cygwin.

Reached 2791 so far.
I observed some mustard above 2000:
Stuff flying in air!
Image
Image
Image
Image
The things are visible but it's not possible to interact with them.

I found out what's happening and why.
I modified the molpyup.py file to make this easier.
It shows some numbers and doesn't allow to lose the game by falling below the screen:
Image

Code: Select all

# Molpy Up!
#
# Based on Max00355's version of DoodleJump, <https://github.com/Max00355/DoodleJump>
# Copyright (C) 2015 by Frankie Primerano,
# written in 120 minutes, see <https://www.reddit.com/r/gamedev/comments/3umhuq/doodle_jump_created_in_120_minutes_with_python/>.
#
# Copyright (C) 2018 by Peter Gerwinski <http://www.peter.gerwinski.de>,
# OTTified in about 120 minutes.
#
# Edited for easier debugging - balthasar_s
#
# This program is Free Software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License (GNU GPL), version 3,
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program, see the file LICENSE.  If not, see
# <http://www.gnu.org/licenses/>.
#
# The player figure "Molpy" is
# Copyright (C) 2013 by BlitzGirl, see user "BlitzGirl" at <http://forums.xkcd.com>,
# released under conditions compatible with both the GNU GPL v3 and the
# CC BY-NC 2.5 license (see below).
#
# All other artwork used by this program is based on xkcd 1190 "Time",
# Copyright (C) 2013 by Randall Munroe, see <http://xkcd.com/1190>,
# released under the Creative Commonns Attribution-NonCommercial Generic License,
# version 2.5 (CC BY-NC 2.5), see <https://creativecommons.org/licenses/by-nc/2.5/>.
#
# In particular, the contents of the directory "assets"
# is NOT subject to the GNU GPL.

import pygame
from pygame.locals import *
import sys
import random

class MolpyUp:

    platformTypeSand = 0
    platformTypeGrass = 1
    platformTypeNormal = platformTypeGrass
    platformTypeGrapevine = 2
    platformTypeAfterLucky = 3
    platformTypeCastle = 4
    platformTypeWater = 5
    platformTypeRaftcastle = 6
    platformTypeFloating = platformTypeRaftcastle
    platformTypeLucky = 7
    platformTypeBreaking = 8
    platformTypeTheEnd = 9
    platformTypeWonTheGame = 10

    itemTypeAccelerator = 0
    itemTypeBeanie = 1
    itemTypeSnake = 2
    itemTypePrickly = 3
    itemTypeSandcastle = 4
    itemTypeFlag = 5
    itemTypePlantSand = 6
    itemTypePlantGrass = 7

    scoreSnake = 1738
    scorePrickly = 2015
    scoreGrass = 2193
    scoreAfterLucky = 2315
    scoreCastle = 2825
    scoreLucky = 2976
    scoreRaftcastle = 3031
    scoreWater = 3043
    scoreTheEnd = 3089
    scoreEpilogue = 3094

    def __init__(self):
        self.sx = 553
        self.sy = 395
        self.extrax = self.sx // 16
        self.screen = pygame.display.set_mode((self.sx, self.sy))
        pygame.font.init()
        self.font = pygame.font.SysFont("xkcd,sans", 25)
        self.clock = pygame.time.Clock()
        self.xmovementmax = 10
        self.imgPlatformSand = [ pygame.image.load("assets/platformSand1.png").convert_alpha(),
                                 pygame.image.load("assets/platformSand2.png").convert_alpha(),
                                 pygame.image.load("assets/platformSand3.png").convert_alpha(),
                                 pygame.image.load("assets/platformSand4.png").convert_alpha() ]
        self.imgPlatformGrass = [ pygame.image.load("assets/platformGrass1.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass2.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass3.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass1f.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass2f.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass3f.png").convert_alpha() ]
        self.imgPlatformWater = [ pygame.image.load("assets/platformWater1.png").convert_alpha(),
                                  pygame.image.load("assets/platformWater2.png").convert_alpha(),
                                  pygame.image.load("assets/platformWater1f.png").convert_alpha(),
                                  pygame.image.load("assets/platformWater2f.png").convert_alpha() ]
        self.imgPlatformAfterLucky = pygame.image.load("assets/platformAfterLucky.png").convert_alpha()
        self.imgPlatformCastle = pygame.image.load("assets/platformCastle.png").convert_alpha()
        self.imgPlatformLuckySleeping = pygame.image.load("assets/platformLuckySleeping.png").convert_alpha()
        self.imgPlatformLuckyAttacking = pygame.image.load("assets/platformLuckyAttacking.png").convert_alpha()
        self.imgPlatformRaftcastle = pygame.image.load("assets/platformRaftcastle.png").convert_alpha()
        self.imgPlatformGrapevine = pygame.image.load("assets/platformGrapevine.png").convert_alpha()
        self.imgPlatformBreaking = pygame.image.load("assets/platformBreaking.png").convert_alpha()
        self.imgPlatformBroken = pygame.image.load("assets/platformBroken.png").convert_alpha()
        self.imgPlatformTheEnd = pygame.image.load("assets/platformTheEnd.png").convert_alpha()
        self.imgPlatformWonTheGame = pygame.image.load("assets/platformWonTheGame.png").convert_alpha()
        self.imgPlayerRightUp = pygame.image.load("assets/playerRightUp.png").convert_alpha()
        self.imgPlayerRightDown = pygame.image.load("assets/playerRightDown.png").convert_alpha()
        self.imgPlayerLeftUp = pygame.image.load("assets/playerLeftUp.png").convert_alpha()
        self.imgPlayerLeftDown = pygame.image.load("assets/playerLeftDown.png").convert_alpha()
        self.imgPlayerRightUpBeanie = pygame.image.load("assets/playerRightUpBeanie.png").convert_alpha()
        self.imgPlayerRightDownBeanie = pygame.image.load("assets/playerRightDownBeanie.png").convert_alpha()
        self.imgPlayerLeftUpBeanie = pygame.image.load("assets/playerLeftUpBeanie.png").convert_alpha()
        self.imgPlayerLeftDownBeanie = pygame.image.load("assets/playerLeftDownBeanie.png").convert_alpha()
        self.imgAccelerator = pygame.image.load("assets/accelerator.png").convert_alpha()
        self.imgAcceleratorUsed = pygame.image.load("assets/acceleratorUsed.png").convert_alpha()
        self.imgBeanie = pygame.image.load("assets/beanie.png").convert_alpha()
        self.imgSnake = pygame.image.load("assets/snake.png").convert_alpha()
        self.imgSnakeLeft = pygame.image.load("assets/snakeLeft.png").convert_alpha()
        self.imgSnakeRight = pygame.image.load("assets/snakeRight.png").convert_alpha()
        self.imgPrickly = pygame.image.load("assets/prickly.png").convert_alpha()
        self.imgPricklyCurled = pygame.image.load("assets/pricklyCurled.png").convert_alpha()
        self.imgSandcastle = pygame.image.load("assets/sandcastle.png").convert_alpha()
        self.imgFlagLeft = pygame.image.load("assets/flagLeft.png").convert_alpha()
        self.imgFlagLeftDown = pygame.image.load("assets/flagLeftDown.png").convert_alpha()
        self.imgFlagRight = pygame.image.load("assets/flagRight.png").convert_alpha()
        self.imgFlagRightDown = pygame.image.load("assets/flagRightDown.png").convert_alpha()
        self.imgPlantSand = [ pygame.image.load("assets/plantSand1.png").convert_alpha(),
                              pygame.image.load("assets/plantSand2.png").convert_alpha(),
                              pygame.image.load("assets/plantSand3.png").convert_alpha(),
                              pygame.image.load("assets/plantSand4.png").convert_alpha(),
                              pygame.image.load("assets/plantSand5.png").convert_alpha() ]
        self.imgPlantGrass = [ pygame.image.load("assets/plantGrass1.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass2.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass3.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass4.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass5.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass6.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass7.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass8.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass9.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass10.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass11.png").convert_alpha() ]
   
    def reset(self):
        self.cameray = 0
        self.score = 0
        self.sandcastles = 0
        self.speed = 30
        self.items = []
        self.playerx = self.sx // 2
        self.playery = self.sy * 3 // 4
        self.direction = 0
        self.jump = 0
        self.gravity = 0
        self.xmovement = 0
        self.playerWearsBeanie = False
        self.playerCarriesFlag = False
        self.hadSnake = False
        self.hadPrickly = False
        self.hadAfterLucky = False
        self.hadCastle = False
        self.hadLucky = False
        self.hadTheEnd = False
        self.raftcastleHasFlag = False
        self.platforms = [[self.playerx, self.playery + self.sy // 6, self.platformTypeSand, 0, 0]]
        self.generatePlatforms()

    def updatePlayer(self):
        if not self.jump:       
            self.playery += self.gravity
            self.gravity += 1
        else:
            self.playery -= self.jump
            self.jump -= 1
        key = pygame.key.get_pressed()
        if key[K_RIGHT]:
            if self.xmovement < self.xmovementmax:
                self.xmovement += 1
            self.direction = 0
        elif key[K_LEFT]:
            if self.xmovement > -self.xmovementmax:
                self.xmovement -= 1
            self.direction = 1
        elif key[K_PLUS] or key[K_KP_PLUS]:
            if pygame.key.get_mods() and KMOD_CTRL:
                self.score += 10
            else:
                self.speed += 1
                self.screen.blit(self.font.render("Speed: " + str(self.speed), -1, (0, 0, 0)), (self.sx // 32, self.sy - self.sy // 12))
        elif key[K_MINUS] or key[K_KP_MINUS]:
            if pygame.key.get_mods() and KMOD_CTRL:
                self.score -= 10
            else:
                self.speed -= 1
                self.screen.blit(self.font.render("Speed: " + str(self.speed), -1, (0, 0, 0)), (self.sx // 32, self.sy - self.sy // 12))
        else:
            if self.xmovement > 0:
                self.xmovement -= 1
            elif self.xmovement < 0:
                self.xmovement += 1
        if self.playerx > self.sx + self.extrax:
            self.playerx = -self.extrax
        elif self.playerx < -self.extrax:
            self.playerx = self.sx + self.extrax
        self.playerx += self.xmovement
        if self.playery - self.cameray <= self.sy // 3:
            self.cameray -= self.sy // 60
        if not self.direction:
            if self.jump:
                if self.playerWearsBeanie:
                    self.screen.blit(self.imgPlayerRightDownBeanie, (self.playerx, self.playery - self.cameray))
                else:
                    self.screen.blit(self.imgPlayerRightDown, (self.playerx, self.playery - self.cameray))
                if self.playerCarriesFlag:
                    self.screen.blit(self.imgFlagLeft, (self.playerx + 24, self.playery - 10 - self.cameray))
            else:
                if self.playerWearsBeanie:
                    self.screen.blit(self.imgPlayerRightUpBeanie, (self.playerx, self.playery - self.cameray))
                else:
                    self.screen.blit(self.imgPlayerRightUp, (self.playerx, self.playery - self.cameray))
                if self.playerCarriesFlag:
                    self.screen.blit(self.imgFlagLeftDown, (self.playerx + 22, self.playery - 10 - self.cameray))
        else:
            if self.jump:
                if self.playerWearsBeanie:
                    self.screen.blit(self.imgPlayerLeftDownBeanie, (self.playerx, self.playery - self.cameray))
                else:
                    self.screen.blit(self.imgPlayerLeftDown, (self.playerx, self.playery - self.cameray))
                if self.playerCarriesFlag:
                    self.screen.blit(self.imgFlagRight, (self.playerx + 13, self.playery - 10 - self.cameray))
            else:
                if self.playerWearsBeanie:
                    self.screen.blit(self.imgPlayerLeftUpBeanie, (self.playerx, self.playery - self.cameray))
                else:
                    self.screen.blit(self.imgPlayerLeftUp, (self.playerx, self.playery - self.cameray))
                if self.playerCarriesFlag:
                    self.screen.blit(self.imgFlagRightDown, (self.playerx + 11, self.playery - 10 - self.cameray))

    def updatePlatforms(self):
        for p in self.platforms:
            if p[2] == self.platformTypeGrapevine:
                img = self.imgPlatformGrapevine
            elif p[2] == self.platformTypeAfterLucky:
                img = self.imgPlatformAfterLucky
            elif p[2] == self.platformTypeCastle:
                img = self.imgPlatformCastle
            elif p[2] == self.platformTypeRaftcastle:
                img = self.imgPlatformRaftcastle
            else:
                # all have same size
                img = self.imgPlatformSand[0]
            rect = pygame.Rect(p[0], p[1], img.get_width(), self.imgPlatformSand[0].get_height())
            player = pygame.Rect(self.playerx + 15, self.playery, self.imgPlayerRightUp.get_width() - 30, self.imgPlayerRightUp.get_height())
            if rect.colliderect(player) and self.gravity and self.playery < (p[1] - self.cameray):
                if p[2] == self.platformTypeBreaking:
                    p[-1] = True
                else:
                    self.jump = self.sy // 20
                    self.gravity = 0
                    if p[2] == self.platformTypeLucky and not self.playerCarriesFlag and p[-2] <= 0:
                        self.xmovement = self.sx // 20
                        self.direction = 0
                        self.cameray -= self.sy // 12
                        p[-2] = -1
                    elif (p[2] == self.platformTypeAfterLucky or p[2] == self.platformTypeCastle or p[2] == self.platformTypeLucky) and self.playerCarriesFlag and not p[-2]:
                        self.playerCarriesFlag = False
                        p[-2] = True
                        self.sandcastles += 1
                    elif p[2] == self.platformTypeRaftcastle and self.playerCarriesFlag and not self.raftcastleHasFlag:
                        self.playerCarriesFlag = False
                        self.raftcastleHasFlag = True
                        self.sandcastles += 1
            if p[2] > self.platformTypeNormal and p[2] <= self.platformTypeFloating:
                if p[-1]:
                    if p[2] == self.platformTypeAfterLucky:
                        img = self.imgPlatformAfterLucky
                    elif p[2] == self.platformTypeCastle:
                        img = self.imgPlatformCastle
                    else:
                        img = self.imgPlatformGrapevine
                    p[0] += self.extrax // 10
                    if p[0] + img.get_width() > self.sx + self.extrax:
                        p[-1] = False
                else:
                    p[0] -= self.extrax // 10
                    if p[0] <= 0:
                        p[-1] = True

    def choosePlatformType(self):
        if self.score >= self.scoreTheEnd:
            return self.platformTypeTheEnd
        platformType = random.randint(0, 999)
        if self.score > self.scoreWater:
            if platformType < 900:
                return self.platformTypeWater
            else:
                return self.platformTypeRaftcastle
        elif platformType < 800:
            if platformType < 1000 * self.score // self.scoreGrass:
                if self.score > self.scoreAfterLucky and not self.hadAfterLucky:
                    self.hadAfterLucky = True
                    return self.platformTypeAfterLucky
                elif self.score > self.scoreCastle and not self.hadCastle:
                    self.hadCastle = True
                    return self.platformTypeCastle
                elif self.score > self.scoreLucky and not self.hadLucky:
                    self.hadLucky = True
                    return self.platformTypeLucky
                else:
                    return self.platformTypeGrass
            else:
                return self.platformTypeSand
        elif platformType < 900:
            return self.platformTypeGrapevine
        else:
            return self.platformTypeBreaking

    def drawPlatforms(self):
        for p in self.platforms:
            check = self.platforms[1][1] - self.cameray
            if check > self.sy:
                platformType = self.choosePlatformType()
                if platformType == self.platformTypeTheEnd:
                    if not self.hadTheEnd:
                        self.platforms.append([self.sx // 2 - self.imgPlatformTheEnd.get_width() // 2, self.platforms[-1][1] - self.sy // 4, self.platformTypeTheEnd, False, False])
                        self.platforms.append([self.sx // 2 - self.imgPlatformWonTheGame.get_width() // 2, self.platforms[-1][1] - self.sy * 2 // 3, self.platformTypeWonTheGame, False, False])
                        self.hadTheEnd = True
                elif platformType == self.platformTypeWater or platformType == self.platformTypeRaftcastle:
                    self.platforms.append([random.randint(0, self.sx * 7 // 8), self.platforms[-1][1] - self.sy // 8, platformType, False, False])
                elif platformType == self.platformTypeLucky:
                    self.platforms.append([0, self.platforms[-1][1] - self.sy // 12, platformType, False, False])
                else:
                    self.platforms.append([random.randint(0, self.sx * 7 // 8), self.platforms[-1][1] - self.sy // 12, platformType, False, False])
                if platformType <= self.platformTypeNormal:
                    if platformType == self.platformTypeSand:
                        self.platforms[-1][-1] = random.randint(0, len(self.imgPlatformSand) - 1)
                    elif platformType == self.platformTypeGrass:
                        self.platforms[-1][-1] = random.randint(0, len(self.imgPlatformGrass) - 1)
                    else:
                        self.platforms[-1][-1] = random.randint(0, len(self.imgPlatformWater) - 1)
                    x = self.platforms[-1][0]
                    y = self.platforms[-1][1]
                    if platformType == self.platformTypeGrass and self.score > self.scoreSnake and not self.hadSnake:
                        self.items.append([x - 10, y + 9, self.itemTypeSnake, False])
                        self.hadSnake = True
                    elif platformType == self.platformTypeGrass and self.score > self.scorePrickly and not self.hadPrickly:
                        self.items.append([x + self.imgPlatformSand[0].get_width() // 3, y + 8, self.itemTypePrickly, False])
                        self.hadPrickly = True
                    else:
                        check = random.randint(0, 999)
                        if check > 800:
                            xx = x + random.randint(0, self.imgPlatformSand[0].get_width() - 40)
                            itemType = random.randint(0,999)
                            if itemType < 50:
                                self.items.append([xx, y + 7, self.itemTypeBeanie, False])
                            elif itemType < 150 and platformType == self.platformTypeSand:
                                self.items.append([xx, y + 7, self.itemTypeSandcastle, False])
                            elif itemType < 350 and platformType == self.platformTypeSand:
                                self.items.append([xx, y + 7, self.itemTypeFlag, False])
                            elif itemType < 950 and platformType == self.platformTypeSand:
                                self.items.append([xx, y + 8, self.itemTypePlantSand, itemType % len(self.imgPlantSand)])
                            elif itemType < 100 and platformType == self.platformTypeGrass:
                                self.items.append([xx, y + 6, self.itemTypeFlag, False])
                            elif itemType < 700 and platformType == self.platformTypeGrass:
                                self.items.append([xx, y + 10, self.itemTypePlantGrass, itemType % len(self.imgPlantGrass)])
                            elif itemType < 850 and platformType == self.platformTypeGrass and self.score > self.scorePrickly:
                                self.items.append([xx, y + 8, self.itemTypePrickly, False])
                            elif itemType < 950 and platformType == self.platformTypeGrass and self.score > self.scoreSnake:
                                self.items.append([x - 10, y + 9, self.itemTypeSnake, False])
                            else:
                                self.items.append([xx - 5, y + 10, self.itemTypeAccelerator, False])
                self.platforms.pop(0)
                if self.score < self.scoreEpilogue:
                    self.score += 1

            self.screen.blit(self.font.render(str(p[1]), -1, (0, 0, 0)), (p[0], p[1] - self.cameray + 16))
            ##############################################################################################
           
            if p[2] == self.platformTypeSand:
                self.screen.blit(self.imgPlatformSand[p[-1]], (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeGrass:
                self.screen.blit(self.imgPlatformGrass[p[-1]], (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeWater:
                self.screen.blit(self.imgPlatformWater[p[-1]], (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeGrapevine:
                self.screen.blit(self.imgPlatformGrapevine, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeAfterLucky:
                if p[-2]:
                    self.screen.blit(self.imgFlagRight, (p[0] + 47, p[1] - 12 - self.cameray))
                self.screen.blit(self.imgPlatformAfterLucky, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeCastle:
                if p[-2]:
                    self.screen.blit(self.imgFlagRight, (p[0] + self.imgPlatformCastle.get_width() - 16, p[1] - 4 - self.cameray))
                self.screen.blit(self.imgPlatformCastle, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeLucky:
                if p[-2]:
                    self.screen.blit(self.imgPlatformLuckyAttacking, (p[0], p[1] - self.imgPlatformLuckyAttacking.get_height() + self.imgPlatformLuckySleeping.get_height() - self.cameray))
                    if p[-2] > 0:
                        self.screen.blit(self.imgFlagRight, (p[0] + self.imgPlatformLuckyAttacking.get_width() - 8, p[1] - 11 - self.cameray))
                else:
                    self.screen.blit(self.imgPlatformLuckySleeping, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeRaftcastle:
                if self.raftcastleHasFlag:
                    self.screen.blit(self.imgFlagRight, (p[0] + 50, p[1] - 13 - self.cameray))
                self.screen.blit(self.imgPlatformRaftcastle, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeBreaking:
                if not p[-1]:
                    self.screen.blit(self.imgPlatformBreaking, (p[0], p[1] - self.cameray))
                else:
                    self.screen.blit(self.imgPlatformBroken, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeTheEnd:
                self.screen.blit(self.imgPlatformTheEnd, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeWonTheGame:
                self.screen.blit(self.imgPlatformWonTheGame, (p[0], p[1] - self.cameray))
        for item in self.items:
            if item[2] == self.itemTypeAccelerator:
                if item[-1]:
                    imgItem = self.imgAcceleratorUsed
                else:
                    imgItem = self.imgAccelerator
            elif item[2] == self.itemTypeBeanie:
                if not item[-1]:
                    imgItem = self.imgBeanie
                else:
                    imgItem = None
            elif item[2] == self.itemTypeSnake:
                if item[-1] == -1:
                    imgItem = self.imgSnakeLeft
                elif item[-1] == 1:
                    imgItem = self.imgSnakeRight
                else:
                    imgItem = self.imgSnake
            elif item[2] == self.itemTypePrickly:
                if not item[-1]:
                    imgItem = self.imgPrickly
                else:
                    imgItem = self.imgPricklyCurled
            elif item[2] == self.itemTypeSandcastle:
                imgItem = self.imgSandcastle
                if item[-1]:
                    self.screen.blit(self.imgFlagRight, (item[0] + 4, item[1] - imgItem.get_height() + 2 - self.imgFlagRight.get_height() - self.cameray))
            elif item[2] == self.itemTypeFlag:
                if not item[-1]:
                    imgItem = self.imgFlagRight
                else:
                    imgItem = None
            elif item[2] == self.itemTypePlantSand:
                imgItem = self.imgPlantSand[item[-1]]
            elif item[2] == self.itemTypePlantGrass:
                imgItem = self.imgPlantGrass[item[-1]]
            if imgItem:

                self.screen.blit(self.font.render(str(item[1] - imgItem.get_height() - self.cameray), -1, (0, 0, 0)), (item[0], item[1] - imgItem.get_height() - self.cameray - 16))
                self.screen.blit(self.font.render(str(item[1]), -1, (0, 0, 0)), (item[0], item[1] - imgItem.get_height() - self.cameray - 32))
                ####################################################################################################################################################################
               
            if not item[-1]:
                if pygame.Rect(item[0], item[1] - imgItem.get_height(), imgItem.get_width(), imgItem.get_height()).colliderect(pygame.Rect(self.playerx, self.playery, self.imgPlayerRightUp.get_width(), self.imgPlayerRightUp.get_height())):
                    if item[2] == self.itemTypeAccelerator:
                        self.jump = self.sy // 12
                        self.cameray -= self.sy // 12
                        item[-1] = True
                    elif item[2] == self.itemTypeBeanie and not self.playerWearsBeanie:
                        self.playerWearsBeanie = True
                        item[-1] = True
                    elif item[2] == self.itemTypeSnake:
                        if self.playerx + self.imgPlayerRightUp.get_width() // 2 < item[0] + self.imgPlatformGrass[0].get_width() // 2:
                            self.xmovement = -self.sx // 30
                            self.direction = 0
                            self.cameray -= self.sy // 12
                            item[-1] = -1
                        else:
                            self.xmovement = self.sx // 30
                            self.direction = 0
                            self.cameray -= self.sy // 12
                            item[-1] = 1
                    elif item[2] == self.itemTypePrickly:
                        item[-1] = True
                    elif item[2] == self.itemTypeSandcastle and self.playerCarriesFlag:
                        self.playerCarriesFlag = False
                        item[-1] = True
                        self.sandcastles += 1
                    elif item[2] == self.itemTypeFlag and not self.playerCarriesFlag:
                        self.playerCarriesFlag = True
                        item[-1] = True

    def generatePlatforms(self):
        on = self.sy
        while on > -self.sy // 6:
            x = random.randint(0, self.sx * 8 // 7)
            self.platforms.append([x, on, self.choosePlatformType(), 0])
            on -= self.sy // 12

    def drawGrid(self):
        for x in range(80):
            pygame.draw.line(self.screen, (222,222,222), (x * 12, 0), (x * 12, self.sy))
            pygame.draw.line(self.screen, (222,222,222), (0, x * 12), (self.sx, x * 12))

    def waitForIt(self, its):
        run = False
        while not run:
            self.clock.tick(self.speed)
            event = pygame.event.poll()
            if event.type == KEYDOWN:
                key = pygame.key.get_pressed()
                if key[K_ESCAPE]:
                    sys.exit()
                for it in its:
                    if key[it]:
                        return it

    def showScore(self):
        line1 = self.font.render("Press ENTER to restart,", -1, (0, 0, 0))
        line2 = self.font.render("ESC to quit.", -1, (0, 0, 0))
        w = max(line1.get_width(), line2.get_width())
        h = line1.get_height() + line2.get_height()
        dx = 10
        dy = 5
        pygame.draw.rect(self.screen, (255,255,255), ((self.sx - w) // 2 - dx, (self.sy - h) // 2 - dy, w + 2 * dx, h + 2 * dy))
        pygame.draw.rect(self.screen, (0,0,0), ((self.sx - w) // 2 - dx, (self.sy - h) // 2 - dy, w + 2 * dx, h + 2 * dy), 3)
        self.screen.blit(line1, ((self.sx - line1.get_width()) // 2, self.sy // 2 - line1.get_height()))
        self.screen.blit(line2, ((self.sx - line2.get_width()) // 2, self.sy // 2))
        pygame.display.flip()
        self.waitForIt([K_RETURN])

    def run(self):
        self.reset()
        while True:
            self.screen.fill((255,255,255))
            self.clock.tick(self.speed)
            for event in pygame.event.get():
                if event.type == QUIT:
                    sys.exit()
                elif event.type == KEYDOWN:
                    key = pygame.key.get_pressed()
                    if key[K_ESCAPE]:
                        sys.exit()
                    elif key[K_SPACE]:
                        self.waitForIt([K_SPACE])
            self.drawGrid()
            self.drawPlatforms()
            self.updatePlayer()
            self.updatePlatforms()
            ###:v
            self.screen.blit(self.font.render(str(self.score)+" "+str(self.cameray)+" "+( "e" if (self.score == 0) else str(self.cameray // self.score) )+" "+str(len(self.platforms))+" "+str(len(self.items)), -1, (0, 0, 0)), (self.sx // 32, self.sy // 24))
            for i in range(0, self.sandcastles):
                self.screen.blit(self.imgFlagRight, (self.sx // 32 + 10 * i, self.sy // 8))
            if self.playery - self.cameray > self.sy * 7 // 6:
                #self.showScore()
                #self.reset()
                self.jump = self.gravity
                self.gravity = 0
            pygame.display.flip()

MolpyUp().run()
(the forums didn't want to allow me to post molpyup.py as an attachment)

So what did I find out:

The game always keeps only 16 platforms in memory.
Old platforms are forgotten.
But this is not true for items.
Items are still remembered even if they are far below the screen.
New items are being generated but old ones are not removed.

The score increases by 1 every 32 pixels.
So when you reach the score 2048 you have moved 65536 pixels (2^16) upwards.

That's when the mustard starts happening.
The game still remembers all the items and still tries to draw them on the screen.

For example, you are so high that one of the items would be drawn 65700 pixels below the top of the screen.
But when this height is passed to the blit() function it becomes 65700 mod 65536 = 164
and so it appears on the screen again 164 pixels below the top.

It is not clearly written in the documentation od this function (https://www.pygame.org/docs/ref/surface.html#pygame.Surface.blit) but it looks like the position is a 16 bit integer.
Which makes sense because the screen sizes are much smaller than 65536 pixels.

pygame is built on top of SDL. the pygame blit function uses SDL function SDL_BlitSurface() (i think) (https://wiki.libsdl.org/SDL_BlitSurface)two of its arguments are of the type of SDL_Rect*, which is a pointer to a structure of 4 int variables.
Ant, apparently, in the SDL library compiled for Cygwin on 32 bit windows the size of int is 16 bits, which makes this kind of mustard possible.

The main reason for this mustard is that the items found on platforms are generated but are not removed when the game does not need them any more.

Spoiler:
molpyup00.PNG
molpyup01.PNG
molpyup01.PNG (4.3 KiB) Viewed 20370 times
molpyup02.PNG
molpyup02.PNG (10.54 KiB) Viewed 20370 times
molpyup03.PNG
molpyup03.PNG (3.58 KiB) Viewed 20370 times
molpyup04.PNG


ETA:
Sustainabilizer wrote:
MolpyUp
I'm interesetd. What made you want to start making a game?
BFTF replay
Good luck, my blitzing friends!
BTTBAA:1023 # Mustard? Use the mirror! Blitzing? Also use the mirror! And here's why. # OTT facebug copy
that's a robot so it doesn't countImage
This text was autogenerated:
swimming unit detector active

User avatar
Sustainabilizer
Posts: 574
Joined: Thu Dec 26, 2013 7:24 pm UTC
Location: The Sustainable University

Re: 1190: "Time"; mustard in the sky!

Postby Sustainabilizer » Mon Apr 02, 2018 7:54 pm UTC

[A projection from the Past appears. It's Sustainabilizer.]

Hi, everyone in the Present!

I got a message from the future.
balthasar_s wrote:I'm now in a place where I don't have any my own computer. I wanted to try Molpy Up on my sister's computer, with Windows XP.
While installing pygame I received this nice greeting:
[...]
I don't really know what went wrong here. Did not try to find out.
Epsilonish.
Sorry, I don't have any idea either.

balthasar_s wrote:I like the new something.
:)

balthasar_s wrote:On the same computer I can run the game with no problems in Cygwin.
Treeish.

balthasar_s wrote:Reached 2791 so far.
Baobabs!
I expected to wait for it for a long Time until anyone gets that far!
I'm impressed.

balthasar_s wrote:I observed some mustard above 2000:
Stuff flying in air!
Uaaaah!

balthasar_s wrote:I found out what's happening and why.
I modified the molpyup.py file to make this easier.
It shows some numbers and doesn't allow to lose the game by falling below the screen:
Hey, even with this “eternity” feature switched on, the game makes fun.
I'm going to adopt this as an option, see below.

balthasar_s wrote:So what did I find out:

The game always keeps only 16 platforms in memory.
Old platforms are forgotten.
But this is not true for items.
Items are still remembered even if they are far below the screen.
New items are being generated but old ones are not removed.
Steakish! This made it rather easy to fix that mustard.
Thanks a lot!

balthasar_s wrote:ETA:
Sustainabilizer wrote:
MolpyUp
I'm interesetd. What made you want to start making a game?
Spoiler:
At my FFS, I am expected to do SCIENCE. One of my projects is to create a SUSTAINABLE smartphone which
  1. is made entirely out of freely-available components,
  2. is running Free Software (Open Source) exclusively, including all device drivers, and
  3. does not spy on its users.
1. and 2. are necessary to obtain 3.

My students decided that the main programming language is Brownish And Shiny, Kind Of Blotchy. So I have an incentive to learn that language.

Some weeks ago we had an intern in our working group (from a secondary school) who decided that the smartphone needs a calculator and a hotdog. With some help from my part, he found something on the Internet and adapted it for being playable on the smartphone.

When I was deep into hotdog-programming in the SNAKE! language anyway, I decided that an OTTIfied version of that hotdog would make a molpish Timeversary Present from the Past.

The original software was written in 2 newpix. In fact it also took me only about 2 newpix to create the first OTTified version. (Okay, demustarding and creating all those somethings which came after that took me some more ... Time ...)

What's a little **dish about this is that the artwork is not under a Free license (GLR released it under a non-commercial license, which is a different thing), so I won't be able to use this hotdog in my FFS smartphone project. Maybe I'll find another story and other artwork which I can use ...

Okay, it's Time for another ...
MolpyUpdate!

Image

  • Fixed the mustard found by balthasar_s, (Redundant thanks!)
  • Improved some something. (Hopefully.)
  • Implemented some cheating [or: debugging] features.
    Spoiler:
    • Pressing <ctrl> + <e> switches on eternal mode as thought of by balthasar_s.
      I was surprised that the hotdog still makes fun with this enabled. Try it out! :)
    • Pressing <ctrl> + <b> gives you a Beanie or removes it.
    • Pressing <ctrl> + <f> gives you a flag or removes it.
    • Pressing <ctrl> + <plus key> cranks up the score by 10,
      pressing <ctrl> + <minus key> cranks it down by 10.
  • Implemented saving and restoring the hotdog.
    • To save, press the <s> key, then the hotdog will save its current state to a file named after the current Time, “”yyyymmdd-hhmmss.molpyup.
    • To restore, invoke the hotdog with the file name as a parameter, e.g. “python molpyup.py 20180402-212045.molpyup”.
    • When the molpy falls down, pressing RETURN will automatically restart from the latest saved or restored state.
Again, you can download the hotdog from here: http://www.peter.gerwinski.de/ott/MolpyUp.zip
and the git repository from here: http://www.peter.gerwinski.de/ott/MolpyUp-master.zip

Okay, back to Blitzing! (Hey, I'm getting closer. Only 42 newpages in the past.) Have fun in the Present!

[The projection fades away, leaving an “ONG” sound behind.]
Last edited by Sustainabilizer on Thu Apr 19, 2018 1:56 pm UTC, edited 1 time in total.
Confused about the OTT? See the Wiki!
Want more 1190: Time? Check out TimeAfterTime!
There is a MIRROR of the OTT, just in case.
Thanks for participating in my Scientific Conference and OTTer Meetup!
Image Help addams!

User avatar
balthasar_s
Posts: 2251
Joined: Mon Nov 28, 2011 3:20 pm UTC
Location: secret base on the Moon
Contact:

Re: 1190: "Time"; mustard in the sky!

Postby balthasar_s » Mon Apr 02, 2018 8:55 pm UTC

Sustainabilizer wrote:
Spoiler:
What's a little **dish about this is that the artwork is not under a Free license (GLR released it under a non-commercial license, which is a different thing), so I won't be able to use this hotdog in my FFS smartphone project.
This made me think again:
Things drawn by me here
like the BFTF and BSTA story-shaped-things
they don't come with any license information
maybe they should?

The software on 1190.bicyclesonthemoon.info is available under the GPL or AGPL license (except bsta which is not available yet beause spoilers. but I will release the source of bsta when the story is finished)
I never made any license information for drawn things.
That's because:
  • I'm not familiar with the licenses. I don't know which would be the best one to use.
  • I did not see a big need for it so far.
but maybe this can be changed soon?
BFTF replay
Good luck, my blitzing friends!
BTTBAA:1023 # Mustard? Use the mirror! Blitzing? Also use the mirror! And here's why. # OTT facebug copy
that's a robot so it doesn't countImage
This text was autogenerated:
swimming unit detector active

User avatar
taixzo
Posts: 1598
Joined: Fri Mar 16, 2012 4:54 am UTC
Location: The Present

Re: 1190: "Time"; mustard in the sky!

Postby taixzo » Mon Apr 02, 2018 9:50 pm UTC

Sustainabilizer wrote:[spoiler]At my FFS, I am expected to do SCIENCE. One of my projects is to create a SUSTAINABLE smartphone which
  1. is made entirely out of freely-available components,
  2. is running Free Software (Open Source) exclusively, including all device drivers, and
  3. does not spy on its users.
1. and 2. are necessary to obtain 3.


Is this related to the Neo900 project?

Sustainabilizer wrote:What's a little **dish about this is that the artwork is not under a Free license (GLR released it under a non-commercial license, which is a different thing), so I won't be able to use this hotdog in my FFS smartphone project. Maybe I'll find another story and other artwork which I can use ...


I note that the molpy image specifically was drawn by BlitzGirl, not by GLR, so perhaps that could be relicensed? As for the other textures, I'd be willing to try and re-draw them - I do have a bit of practice drawing things in the Time style now.
BlitzGirl the Next
BlitzGirl the Fast
Knight Temporal
Bringer of the Light

Useless utilities: Newpix clock for Mac OS X, Newpix clock for Ubuntu

Sandgarden - a relaxing experience for Time Waiters

Best wishes to GnomeAnne, ColletArrow and january1may! One day you will all join me in the Present!

User avatar
GnomeAnne
Posts: 541
Joined: Sat Sep 03, 2016 12:35 am UTC
Location: [center][img]http://forums.xkcd.com/download/file.php?id=54350&t=1[/img]

bstONG

Postby GnomeAnne » Tue Apr 03, 2018 1:52 am UTC

...
Image

Wait For It.

User avatar
BlitzGirl
Posts: 8999
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Both Present and Past...... Schizoblitz: 115/2601 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Tue Apr 03, 2018 3:02 am UTC

I did draw the staticmolpy, but the conventional molpysmiley was found running wild on the internet a long Time ago.

Includes cheating and danger:
Spoiler:
...

Image
A molpy! It needs a hat.

BlitzGirl: <ctrl> + <b>

Image
Awesomeful! Now hat's what I'm talking about!

Molpy: <ctrl> + <p>

Image
Uh oh.

Molpy: <ctrl> + <c>
<ctrl> + <v>
<ctrl> + <v>
<ctrl> + <v>
<ctrl> + <v>

ImageImageImageImageImage
CLOSE THE SPOILER! THEY'RE GOING TO GET OUT! CLOSE IT CLOSE IT CLOSE I
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<-Blog
~.Image~.FAQ->Image

User avatar
Eternal Density
Posts: 5547
Joined: Thu Oct 02, 2008 12:37 am UTC
Contact:

Re: 1190: "T>i>me"

Postby Eternal Density » Tue Apr 03, 2018 4:06 am UTC

NoMouse wrote:
Eternal Density wrote:I don't think the thwapstick is supported on Chromebook :(

That's weird. It works in Chrome on my Android phone. Just have to use long click instead of right click. But navigating the submenus on mobile is rather steambottlish, much molpier on desktop.

EDIT: Holy GLR, what did I do? I hit "quote" instead of "edit". :oops:
EDIT2: Removed the unnecessary quote, now we have to live with this doublepost. Sorry.
No right clicking works fine. It's the thwapstick that doesn't work.
Play the game of Time! castle.chirpingmustard.com Hotdog Vending Supplier But what is this?
In the Marvel vs. DC film-making war, we're all winners.

User avatar
mrob27
Posts: 1325
Joined: Tue Jun 28, 2011 2:19 am UTC
Location: ]〖  
Contact:

1190: Time: MY MUSTARD BLINDPOSTETH OVER

Postby mrob27 » Tue Apr 03, 2018 9:44 am UTC

I like the new MolpyUP! even better.
  For some unknown reason, on my machine it thinks the "CTRL" key is always being pressed, regardless of reality. That makes the speed adjustment not work (and makes the "debugging/cheating" stuff easier to access). I hacked the code a bit to make it ignore KMOD_CTRL in the places where it's checking for + and - keys. I couldn't think of a reason why I'd want to change the score anyway.
Robert Munafohttp://mrob.com@mrob_27
Image
I ᴍᴀᴅᴇ sᴏɍᴛᴡᴀʀᴇ ᴛʜᴀᴛ Rᴀɴᴅᴀʟʟ ɍᴏᴜɴᴅ ᴜsᴇɍᴜʟ ɪɴ ᴛʜɪs хᴋᴄᴅ

User avatar
balthasar_s
Posts: 2251
Joined: Mon Nov 28, 2011 3:20 pm UTC
Location: secret base on the Moon
Contact:

Re: 1190: Time; Everything is a CTRL now.

Postby balthasar_s » Tue Apr 03, 2018 6:13 pm UTC

mrob27 wrote:For some unknown reason, on my machine it thinks the "CTRL" key is always being pressed, regardless of reality.
I also noticed this but only when I had num lock turned on.
The reason is not unknown any more.
The problem is here:

Code: Select all

pygame.key.get_mods() and KMOD_CTRL
"and" is a logical and operator. A bitwise and operator "&" should be used here:

Code: Select all

pygame.key.get_mods() & KMOD_CTRL

With the currently used "and" operator the result will be true if both numbers are not 0. So the game will think that CTRL is pressed if any other modifier is active.
A test:

Code: Select all

self.screen.blit(self.font.render(str(self.score)+";  "+str(pygame.key.get_mods())+" & "+str(KMOD_CTRL)+" = "+str(pygame.key.get_mods() and KMOD_CTRL), -1, (0, 0, 0)), (self.sx // 32, self.sy // 24))
and the result:
Image
pygame.key.get_mods() is 4096 because num lock is on.
KMOD_CTRL is 192 (left ctrl = 64, right ctrl = 128, 64 | 128 = 192).
Both values are not zero so the result is not 0.
The game thinks I pressed CTRL, I didn't.

mrob27 wrote:I couldn't think of a reason why I'd want to change the score anyway.
debagging.

Redundant:
Spoiler:
molpy_up_and_ctrl.png
molpy_up_and_ctrl.png (10.96 KiB) Viewed 18338 times


ETA: I also notticed:
The platforms generated when the game starts can be placed so that they are partially outside the right edge of the game window.
This does not happen with platforms which are generated later when molpy jumps upwards.
Also the floating grapevine platforms move a bit outside the right side of the window, they don't do something like this on the left side.

ETAA*: also, when I pause the game with space and then the game window gets covered by another window, then the game window becomes completely white. Nothing is redrawn until I resume the game.

*ETAA - edited to add again
BFTF replay
Good luck, my blitzing friends!
BTTBAA:1023 # Mustard? Use the mirror! Blitzing? Also use the mirror! And here's why. # OTT facebug copy
that's a robot so it doesn't countImage
This text was autogenerated:
swimming unit detector active

User avatar
Sustainabilizer
Posts: 574
Joined: Thu Dec 26, 2013 7:24 pm UTC
Location: The Sustainable University

Re: 1190: Time; Everything is a CTRL now.

Postby Sustainabilizer » Tue Apr 03, 2018 7:29 pm UTC

Hi again from the Past.
balthasar_s wrote:
mrob27 wrote:For some unknown reason, on my machine it thinks the "CTRL" key is always being pressed, regardless of reality.
I also noticed this but only when I had num lock turned on.
The reason is not unknown any more.
The problem is here:

Code: Select all

pygame.key.get_mods() and KMOD_CTRL
"and" is a logical and operator. A bitwise and operator "&" should be used here:
Uaaah!
I thought, “and” was the bit-wise “and” operator when applied to numbers.
But of course it isn't. It cannot be it in SNAKE. Sorry.
balthasar_s wrote:ETA: I also notticed:
The platforms generated when the game starts can be placed so that they are partially outside the right edge of the game window.
This does not happen with platforms which are generated later when molpy jumps upwards.
I made this consistent now. (Sorry for removing some redundancy from the code.)
Initial platforms don't feature items, forcing you to wait for them. Or should they better be there from the beginning?

Redundant: Seaish thanks for the steakish demustarding! This made it really easy to fix everything.
Also thanks for informing me in the Past!


MolpyUpdate: Image
  • Fixed mustard with key modifiers (<ctrl>, <num lock>, etc.).
  • Made the initial generation of platforms consistent with future ones.
Hotdog: http://www.peter.gerwinski.de/ott/MolpyUp.zip
GIT: http://www.peter.gerwinski.de/ott/MolpyUp-master.zip


[Back to the Past. See you soon in the Present!]
Confused about the OTT? See the Wiki!
Want more 1190: Time? Check out TimeAfterTime!
There is a MIRROR of the OTT, just in case.
Thanks for participating in my Scientific Conference and OTTer Meetup!
Image Help addams!

User avatar
mscha
Posts: 6879
Joined: Tue Mar 26, 2013 10:21 pm UTC
Location: NL
Contact:

1190: "Time" - Time Revisited - np353

Postby mscha » Tue Apr 03, 2018 8:10 pm UTC

UNGLOCENTRIST...
Image
Spoiler:
Wait for it.
Replay Time live here!

OTT Time Travel

AUTOMOME wrote:I CORINNED HALF A YIP FOR ONE DARKENING PIXEL

-- posted by oldpixbot

User avatar
lmjb1964
Posts: 2366
Joined: Mon Apr 04, 2011 7:09 pm UTC
Location: In the Present! Need to ketchup NP 2236-2280, plus NP 2026-2058 and something like 2060-2090+?.

Re: 1190: "Time"

Postby lmjb1964 » Tue Apr 03, 2018 10:06 pm UTC

Just had a slightly RELATED advising appointment. The student I just saw pointed at the xkcd comic I have in my office ("Two Years") and said, "I love xkcd!" I probably should have said, "The River is small!", but instead we talked about how awesomeful xkcd. I mentioned spending a lot of time on the fora and he didn't say, "Yeah, me too!", so I figured he wasn't an OTTer. We still had a fun conversation.

Awesomeful ottification, BlitzGirl!

Hi, mscha! Great to see you!

Febrion wrote:I liked the new OTHERCOMIC at first, but then I dug around a bit and found
Spoiler:
"File -> Open -> C:\ -> Bookmarks -> Comics -> T -> i -> me", which links to T** **D. Now I'm sad

But now we know that T** **D is not always T** **D. Or, if it is T** **D, it may be the first frame of something else.

NoMouse wrote:EDIT: Holy GLR, what did I do? I hit "quote" instead of "edit". :oops:
EDIT2: Removed the unnecessary quote, now we have to live with this doublepost. Sorry.

If I had a dollar for every time I did that since they changed the fora, I'd...well, have enough for a sandwich.

BlitzGirl wrote:I did draw the staticmolpy, but the conventional molpysmiley was found running wild on the internet a long Time ago.

Includes cheating and danger:
Spoiler:
...

Image
A molpy! It needs a hat.

BlitzGirl: <ctrl> + <b>

Image
Awesomeful! Now hat's what I'm talking about!

Molpy: <ctrl> + <p>

Image
Uh oh.

Molpy: <ctrl> + <c>
<ctrl> + <v>
<ctrl> + <v>
<ctrl> + <v>
<ctrl> + <v>

ImageImageImageImageImage
CLOSE THE SPOILER! THEY'RE GOING TO GET OUT! CLOSE IT CLOSE IT CLOSE I

:azule: You know its bad when the molpy army turns on its BlitzGirl.

Ooh, so the other side of the cassette made the picture go all static-y. Maybe as the tape keeps running, we 'll find out what happened to b and kxa.

It took me so many tries to post this! I got myself into unmatched tag hell, and it took a while before I got out. Good thing I did a preview before I hit submit!
Image

Help addams stay in her home! https://www.crowdrise.com/in-a-comically-tragic-turn-of-events-addams-didnt-die
Imagesmiley by yappo
That's a robot but it totally counts. Image

bot by balthasar_s

User avatar
BlitzGirl
Posts: 8999
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Both Present and Past...... Schizoblitz: 115/2601 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Wed Apr 04, 2018 5:20 am UTC

(Tagmustard is the worst mustard. But it confuses beaniemolps so I was able to escape...)
What a treeish RELATED advising story, lmjb.

Recursion is nigh in the replay!
Cue readies the sands!

Image
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<-Blog
~.Image~.FAQ->Image

User avatar
balthasar_s
Posts: 2251
Joined: Mon Nov 28, 2011 3:20 pm UTC
Location: secret base on the Moon
Contact:

Re: 1190: Time; Everything is a CTRL now.

Postby balthasar_s » Wed Apr 04, 2018 7:09 pm UTC

Sustainabilizer wrote:MolpyUpdate: Image
I made a small change in the game.

When playing Molpy Up, if I jump into the trebuchet it will lounch my molpy high into the sky and it will be outside the game window.
If this happens then I don't see the molpy's horizontal position so it's not easy to move it so that it will land on a platform when it falls down.
Actually, for me this is one of the 2 most common reasons of losing the game. The other one is the
Spoiler:
SNAKE!

I added an arrow pointing upwards which will show the molpy's horizontal position, allowing me to correctly align the molpy with the platforms:
Image
This is the modified game:

Code: Select all

# Molpy Up!
#
# Based on Max00355's version of DoodleJump, <https://github.com/Max00355/DoodleJump>
# Copyright (C) 2015 by Frankie Primerano,
# written in 120 minutes, see <https://www.reddit.com/r/gamedev/comments/3umhuq/doodle_jump_created_in_120_minutes_with_python/>.
#
# Copyright (C) 2018 by Peter Gerwinski <http://www.peter.gerwinski.de>,
# OTTified in about 120 minutes.
#
# edited to add arrow - balthasar_s
#
# This program is Free Software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License (GNU GPL), version 3,
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program, see the file LICENSE.  If not, see
# <http://www.gnu.org/licenses/>.
#
# The player figure "Molpy" is
# Copyright (C) 2013 by BlitzGirl, see user "BlitzGirl" at <http://forums.xkcd.com>,
# released under conditions compatible with both the GNU GPL v3 and the
# CC BY-NC 2.5 license (see below).
#
# All other artwork used by this program is based on xkcd 1190 "Time",
# Copyright (C) 2013 by Randall Munroe, see <http://xkcd.com/1190>,
# released under the Creative Commonns Attribution-NonCommercial Generic License,
# version 2.5 (CC BY-NC 2.5), see <https://creativecommons.org/licenses/by-nc/2.5/>.
#
# In particular, the contents of the directory "assets"
# is NOT subject to the GNU GPL.

import pygame
from pygame.locals import *
import sys
import datetime
import random

class MolpyUp:

    platformTypeSand = 0
    platformTypeGrass = 1
    platformTypeNormal = platformTypeGrass
    platformTypeGrapevine = 2
    platformTypeAfterLucky = 3
    platformTypeCastle = 4
    platformTypeWater = 5
    platformTypeRaftcastle = 6
    platformTypeFloating = platformTypeRaftcastle
    platformTypeLucky = 7
    platformTypeBreaking = 8
    platformTypeTheEnd = 9
    platformTypeWonTheGame = 10

    itemTypeAccelerator = 0
    itemTypeBeanie = 1
    itemTypeSnake = 2
    itemTypePrickly = 3
    itemTypeSandcastle = 4
    itemTypeFlag = 5
    itemTypePlantSand = 6
    itemTypePlantGrass = 7

    scoreSnake = 1738
    scorePrickly = 2015
    scoreGrass = 2193
    scoreAfterLucky = 2315
    scoreCastle = 2825
    scoreLucky = 2976
    scoreRaftcastle = 3031
    scoreWater = 3043
    scoreTheEnd = 3089
    scoreEpilogue = 3094

    def __init__(self):
        self.sx = 553
        self.sy = 395
        self.extrax = self.sx // 16
        self.screen = pygame.display.set_mode((self.sx, self.sy))
        pygame.font.init()
        self.font = pygame.font.SysFont("xkcd,sans", 25)
        self.clock = pygame.time.Clock()
        self.xmovementmax = 10
        self.eternal = False
        self.imgPlatformSand = [ pygame.image.load("assets/platformSand1.png").convert_alpha(),
                                 pygame.image.load("assets/platformSand2.png").convert_alpha(),
                                 pygame.image.load("assets/platformSand3.png").convert_alpha(),
                                 pygame.image.load("assets/platformSand4.png").convert_alpha() ]
        self.imgPlatformGrass = [ pygame.image.load("assets/platformGrass1.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass2.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass3.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass1f.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass2f.png").convert_alpha(),
                                  pygame.image.load("assets/platformGrass3f.png").convert_alpha() ]
        self.imgPlatformWater = [ pygame.image.load("assets/platformWater1.png").convert_alpha(),
                                  pygame.image.load("assets/platformWater2.png").convert_alpha(),
                                  pygame.image.load("assets/platformWater1f.png").convert_alpha(),
                                  pygame.image.load("assets/platformWater2f.png").convert_alpha() ]
        self.imgPlatformAfterLucky = pygame.image.load("assets/platformAfterLucky.png").convert_alpha()
        self.imgPlatformCastle = pygame.image.load("assets/platformCastle.png").convert_alpha()
        self.imgPlatformLuckySleeping = pygame.image.load("assets/platformLuckySleeping.png").convert_alpha()
        self.imgPlatformLuckyAttacking = pygame.image.load("assets/platformLuckyAttacking.png").convert_alpha()
        self.imgPlatformRaftcastle = pygame.image.load("assets/platformRaftcastle.png").convert_alpha()
        self.imgPlatformGrapevine = pygame.image.load("assets/platformGrapevine.png").convert_alpha()
        self.imgPlatformBreaking = pygame.image.load("assets/platformBreaking.png").convert_alpha()
        self.imgPlatformBroken = pygame.image.load("assets/platformBroken.png").convert_alpha()
        self.imgPlatformTheEnd = pygame.image.load("assets/platformTheEnd.png").convert_alpha()
        self.imgPlatformWonTheGame = pygame.image.load("assets/platformWonTheGame.png").convert_alpha()
        self.imgPlayerRightUp = pygame.image.load("assets/playerRightUp.png").convert_alpha()
        self.imgPlayerRightDown = pygame.image.load("assets/playerRightDown.png").convert_alpha()
        self.imgPlayerLeftUp = pygame.image.load("assets/playerLeftUp.png").convert_alpha()
        self.imgPlayerLeftDown = pygame.image.load("assets/playerLeftDown.png").convert_alpha()
        self.imgPlayerRightUpBeanie = pygame.image.load("assets/playerRightUpBeanie.png").convert_alpha()
        self.imgPlayerRightDownBeanie = pygame.image.load("assets/playerRightDownBeanie.png").convert_alpha()
        self.imgPlayerLeftUpBeanie = pygame.image.load("assets/playerLeftUpBeanie.png").convert_alpha()
        self.imgPlayerLeftDownBeanie = pygame.image.load("assets/playerLeftDownBeanie.png").convert_alpha()
        self.imgAccelerator = pygame.image.load("assets/accelerator.png").convert_alpha()
        self.imgAcceleratorUsed = pygame.image.load("assets/acceleratorUsed.png").convert_alpha()
        self.imgBeanie = pygame.image.load("assets/beanie.png").convert_alpha()
        self.imgSnake = pygame.image.load("assets/snake.png").convert_alpha()
        self.imgSnakeLeft = pygame.image.load("assets/snakeLeft.png").convert_alpha()
        self.imgSnakeRight = pygame.image.load("assets/snakeRight.png").convert_alpha()
        self.imgPrickly = pygame.image.load("assets/prickly.png").convert_alpha()
        self.imgPricklyCurled = pygame.image.load("assets/pricklyCurled.png").convert_alpha()
        self.imgSandcastle = pygame.image.load("assets/sandcastle.png").convert_alpha()
        self.imgFlagLeft = pygame.image.load("assets/flagLeft.png").convert_alpha()
        self.imgFlagLeftDown = pygame.image.load("assets/flagLeftDown.png").convert_alpha()
        self.imgFlagRight = pygame.image.load("assets/flagRight.png").convert_alpha()
        self.imgFlagRightDown = pygame.image.load("assets/flagRightDown.png").convert_alpha()
        self.imgPlantSand = [ pygame.image.load("assets/plantSand1.png").convert_alpha(),
                              pygame.image.load("assets/plantSand2.png").convert_alpha(),
                              pygame.image.load("assets/plantSand3.png").convert_alpha(),
                              pygame.image.load("assets/plantSand4.png").convert_alpha(),
                              pygame.image.load("assets/plantSand5.png").convert_alpha() ]
        self.imgPlantGrass = [ pygame.image.load("assets/plantGrass1.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass2.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass3.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass4.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass5.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass6.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass7.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass8.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass9.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass10.png").convert_alpha(),
                               pygame.image.load("assets/plantGrass11.png").convert_alpha() ]
        self.imgMolpArrow = pygame.image.load("assets/molpArrow.png").convert_alpha()
   
    def reset(self):
        self.cameray = 0
        self.score = 0
        self.sandcastles = 0
        self.speed = 30
        self.playerx = self.sx // 2
        self.playery = self.sy * 3 // 4
        self.direction = 0
        self.jump = 0
        self.gravity = 0
        self.xmovement = 0
        self.playerWearsBeanie = False
        self.playerCarriesFlag = False
        self.hadSnake = False
        self.hadPrickly = False
        self.hadAfterLucky = False
        self.hadCastle = False
        self.hadLucky = False
        self.hadTheEnd = False
        self.raftcastleHasFlag = False
        self.platforms = [[self.playerx, self.playery + self.sy // 6, self.platformTypeSand, 0, 0]]
        self.generateInitialPlatforms()
        self.items = []
        if self.filename:
            self.restoreGame (self.filename)

    def saveGame(self):
        self.filename = datetime.datetime.now().strftime("%Y%m%d-%H%M%S.molpyup")
        with open(self.filename, "w") as file:
            file.write("MolpyUp!\n")
            file.write("cameray: " + str(self.cameray) + "\n")
            file.write("score: " + str(self.score) + "\n")
            file.write("sandcastles: " + str(self.sandcastles) + "\n")
            file.write("speed: " + str(self.speed) + "\n")
            file.write("playerx: " + str(self.playerx) + "\n")
            file.write("playery: " + str(self.playery) + "\n")
            file.write("direction: " + str(self.direction) + "\n")
            file.write("jump: " + str(self.jump) + "\n")
            file.write("gravity: " + str(self.gravity) + "\n")
            file.write("xmovement: " + str(self.xmovement) + "\n")
            file.write("playerWearsBeanie: " + str(self.playerWearsBeanie) + "\n")
            file.write("playerCarriesFlag: " + str(self.playerCarriesFlag) + "\n")
            file.write("hadSnake: " + str(self.hadSnake) + "\n")
            file.write("hadPrickly: " + str(self.hadPrickly) + "\n")
            file.write("hadAfterLucky: " + str(self.hadAfterLucky) + "\n")
            file.write("hadCastle: " + str(self.hadCastle) + "\n")
            file.write("hadLucky: " + str(self.hadLucky) + "\n")
            file.write("hadTheEnd: " + str(self.hadTheEnd) + "\n")
            file.write("raftcastleHasFlag: " + str(self.raftcastleHasFlag) + "\n")
            file.write("eternal: " + str(self.eternal) + "\n")
            file.write("platforms: " + str(self.platforms) + "\n")
            file.write("items: " + str(self.items) + "\n")

    def readVariable(self, line, name, var):
        if line.startswith(name + ": "):
            return eval (line[len(name) + 2:])
        else:
            return var

    def restoreGame(self, filename):
        try:
            with open(filename, "r") as file:
                lines = file.readlines()
            for line in lines:
                self.cameray = self.readVariable(line, "cameray", self.cameray)
                self.score = self.readVariable(line, "score", self.score)
                self.sandcastles = self.readVariable(line, "sandcastles", self.sandcastles)
                self.speed = self.readVariable(line, "speed", self.speed)
                self.playerx = self.readVariable(line, "playerx", self.playerx)
                self.playery = self.readVariable(line, "playery", self.playery)
                self.direction = self.readVariable(line, "direction", self.direction)
                self.jump = self.readVariable(line, "jump", self.jump)
                self.gravity = self.readVariable(line, "gravity", self.gravity)
                self.xmovement = self.readVariable(line, "xmovement", self.xmovement)
                self.playerWearsBeanie = self.readVariable(line, "playerWearsBeanie", self.playerWearsBeanie)
                self.playerCarriesFlag = self.readVariable(line, "playerCarriesFlag", self.playerCarriesFlag)
                self.hadSnake = self.readVariable(line, "hadSnake", self.hadSnake)
                self.hadPrickly = self.readVariable(line, "hadPrickly", self.hadPrickly)
                self.hadAfterLucky = self.readVariable(line, "hadAfterLucky", self.hadAfterLucky)
                self.hadCastle = self.readVariable(line, "hadCastle", self.hadCastle)
                self.hadLucky = self.readVariable(line, "hadLucky", self.hadLucky)
                self.hadTheEnd = self.readVariable(line, "hadTheEnd", self.hadTheEnd)
                self.raftcastleHasFlag = self.readVariable(line, "raftcastleHasFlag", self.raftcastleHasFlag)
                self.platforms = self.readVariable(line, "platforms", self.platforms)
                self.items = self.readVariable(line, "items", self.items)
            return True
        except FileNotFoundError:
            return False

    def updatePlayer(self):
        if not self.jump:       
            self.playery += self.gravity
            self.gravity += 1
        else:
            self.playery -= self.jump
            self.jump -= 1
        key = pygame.key.get_pressed()
        if key[K_RIGHT]:
            if self.xmovement < self.xmovementmax:
                self.xmovement += 1
            self.direction = 0
        elif key[K_LEFT]:
            if self.xmovement > -self.xmovementmax:
                self.xmovement -= 1
            self.direction = 1
        elif key[K_PLUS] or key[K_KP_PLUS]:
            if pygame.key.get_mods() & KMOD_CTRL:
                self.score += 10
            else:
                self.speed += 1
                self.screen.blit(self.font.render("Speed: " + str(self.speed), -1, (0, 0, 0)), (self.sx // 32, self.sy - self.sy // 12))
        elif key[K_MINUS] or key[K_KP_MINUS]:
            if pygame.key.get_mods() & KMOD_CTRL:
                self.score -= 10
            else:
                self.speed -= 1
                self.screen.blit(self.font.render("Speed: " + str(self.speed), -1, (0, 0, 0)), (self.sx // 32, self.sy - self.sy // 12))
        else:
            if self.xmovement > 0:
                self.xmovement -= 1
            elif self.xmovement < 0:
                self.xmovement += 1
        if self.playerx > self.sx + self.extrax:
            self.playerx = -self.extrax
        elif self.playerx < -self.extrax:
            self.playerx = self.sx + self.extrax
        self.playerx += self.xmovement
        if self.playery - self.cameray <= self.sy // 3:
            self.cameray -= self.sy // 60
       
        if (self.playery - self.cameray + self.imgPlayerRightUp.get_height()) < 0:
            self.screen.blit(self.imgMolpArrow, (self.playerx, 2))
        else:
               
            if not self.direction:
                if self.jump:
                    if self.playerWearsBeanie:
                        self.screen.blit(self.imgPlayerRightDownBeanie, (self.playerx, self.playery - self.cameray))
                    else:
                        self.screen.blit(self.imgPlayerRightDown, (self.playerx, self.playery - self.cameray))
                    if self.playerCarriesFlag:
                        self.screen.blit(self.imgFlagLeft, (self.playerx + 24, self.playery - 10 - self.cameray))
                else:
                    if self.playerWearsBeanie:
                        self.screen.blit(self.imgPlayerRightUpBeanie, (self.playerx, self.playery - self.cameray))
                    else:
                        self.screen.blit(self.imgPlayerRightUp, (self.playerx, self.playery - self.cameray))
                    if self.playerCarriesFlag:
                        self.screen.blit(self.imgFlagLeftDown, (self.playerx + 22, self.playery - 10 - self.cameray))
            else:
                if self.jump:
                    if self.playerWearsBeanie:
                        self.screen.blit(self.imgPlayerLeftDownBeanie, (self.playerx, self.playery - self.cameray))
                    else:
                        self.screen.blit(self.imgPlayerLeftDown, (self.playerx, self.playery - self.cameray))
                    if self.playerCarriesFlag:
                        self.screen.blit(self.imgFlagRight, (self.playerx + 13, self.playery - 10 - self.cameray))
                else:
                    if self.playerWearsBeanie:
                        self.screen.blit(self.imgPlayerLeftUpBeanie, (self.playerx, self.playery - self.cameray))
                    else:
                        self.screen.blit(self.imgPlayerLeftUp, (self.playerx, self.playery - self.cameray))
                    if self.playerCarriesFlag:
                        self.screen.blit(self.imgFlagRightDown, (self.playerx + 11, self.playery - 10 - self.cameray))

    def choosePlatformType(self):
        if self.score >= self.scoreTheEnd:
            return self.platformTypeTheEnd
        platformType = random.randint(0, 999)
        if self.score > self.scoreWater:
            if platformType < 900:
                return self.platformTypeWater
            else:
                return self.platformTypeRaftcastle
        elif platformType < 800:
            if platformType < 1000 * self.score // self.scoreGrass:
                if self.score > self.scoreAfterLucky and not self.hadAfterLucky:
                    self.hadAfterLucky = True
                    return self.platformTypeAfterLucky
                elif self.score > self.scoreCastle and not self.hadCastle:
                    self.hadCastle = True
                    return self.platformTypeCastle
                elif self.score > self.scoreLucky and not self.hadLucky:
                    self.hadLucky = True
                    return self.platformTypeLucky
                else:
                    return self.platformTypeGrass
            else:
                return self.platformTypeSand
        elif platformType < 900:
            return self.platformTypeGrapevine
        else:
            return self.platformTypeBreaking

    def generateNewPlatform(self):
        platformType = self.choosePlatformType()
        if platformType == self.platformTypeTheEnd:
            if not self.hadTheEnd:
                self.platforms.append([self.sx // 2 - self.imgPlatformTheEnd.get_width() // 2, self.platforms[-1][1] - self.sy // 4, self.platformTypeTheEnd, False, False])
                self.platforms.append([self.sx // 2 - self.imgPlatformWonTheGame.get_width() // 2, self.platforms[-1][1] - self.sy * 2 // 3, self.platformTypeWonTheGame, False, False])
                self.hadTheEnd = True
        elif platformType == self.platformTypeWater or platformType == self.platformTypeRaftcastle:
            self.platforms.append([random.randint(0, self.sx * 7 // 8), self.platforms[-1][1] - self.sy // 8, platformType, False, False])
        elif platformType == self.platformTypeLucky:
            self.platforms.append([0, self.platforms[-1][1] - self.sy // 12, platformType, False, False])
        else:
            self.platforms.append([random.randint(0, self.sx * 7 // 8), self.platforms[-1][1] - self.sy // 12, platformType, False, False])
        if platformType <= self.platformTypeNormal:
            if platformType == self.platformTypeSand:
                self.platforms[-1][-1] = random.randint(0, len(self.imgPlatformSand) - 1)
            elif platformType == self.platformTypeGrass:
                self.platforms[-1][-1] = random.randint(0, len(self.imgPlatformGrass) - 1)
            else:
                self.platforms[-1][-1] = random.randint(0, len(self.imgPlatformWater) - 1)
            x = self.platforms[-1][0]
            y = self.platforms[-1][1]
            if platformType == self.platformTypeGrass and self.score > self.scoreSnake and not self.hadSnake:
                self.items.append([x - 10, y + 9, self.itemTypeSnake, False])
                self.hadSnake = True
            elif platformType == self.platformTypeGrass and self.score > self.scorePrickly and not self.hadPrickly:
                self.items.append([x + self.imgPlatformSand[0].get_width() // 3, y + 8, self.itemTypePrickly, False])
                self.hadPrickly = True
            elif self.score > 0:
                check = random.randint(0, 999)
                if check > 800:
                    xx = x + random.randint(0, self.imgPlatformSand[0].get_width() - 40)
                    itemType = random.randint(0,999)
                    if itemType < 50:
                        self.items.append([xx, y + 7, self.itemTypeBeanie, False])
                    elif itemType < 150 and platformType == self.platformTypeSand:
                        self.items.append([xx, y + 7, self.itemTypeSandcastle, False])
                    elif itemType < 350 and platformType == self.platformTypeSand:
                        self.items.append([xx, y + 7, self.itemTypeFlag, False])
                    elif itemType < 950 and platformType == self.platformTypeSand:
                        self.items.append([xx, y + 8, self.itemTypePlantSand, itemType % len(self.imgPlantSand)])
                    elif itemType < 100 and platformType == self.platformTypeGrass:
                        self.items.append([xx, y + 6, self.itemTypeFlag, False])
                    elif itemType < 700 and platformType == self.platformTypeGrass:
                        self.items.append([xx, y + 10, self.itemTypePlantGrass, itemType % len(self.imgPlantGrass)])
                    elif itemType < 850 and platformType == self.platformTypeGrass and self.score > self.scorePrickly:
                        self.items.append([xx, y + 8, self.itemTypePrickly, False])
                    elif itemType < 950 and platformType == self.platformTypeGrass and self.score > self.scoreSnake:
                        self.items.append([x - 10, y + 9, self.itemTypeSnake, False])
                    else:
                        self.items.append([xx - 5, y + 10, self.itemTypeAccelerator, False])

    def updatePlatforms(self):
        while self.platforms[0][1] - self.cameray > self.sy + self.sy // 12:
            self.generateNewPlatform()
            self.platforms.pop(0)
            if self.score < self.scoreEpilogue:
                self.score += 1
        for p in self.platforms:
            if p[2] == self.platformTypeGrapevine:
                img = self.imgPlatformGrapevine
            elif p[2] == self.platformTypeAfterLucky:
                img = self.imgPlatformAfterLucky
            elif p[2] == self.platformTypeCastle:
                img = self.imgPlatformCastle
            elif p[2] == self.platformTypeRaftcastle:
                img = self.imgPlatformRaftcastle
            else:
                # all have same size
                img = self.imgPlatformSand[0]
            rect = pygame.Rect(p[0], p[1], img.get_width(), self.imgPlatformSand[0].get_height())
            player = pygame.Rect(self.playerx + 15, self.playery, self.imgPlayerRightUp.get_width() - 30, self.imgPlayerRightUp.get_height())
            if rect.colliderect(player) and self.gravity and self.playery < (p[1] - self.cameray):
                if p[2] == self.platformTypeBreaking:
                    p[-1] = True
                else:
                    self.jump = self.sy // 20
                    self.gravity = 0
                    if p[2] == self.platformTypeLucky and not (self.playerWearsBeanie and self.playerCarriesFlag) and p[-2] <= 0:
                        self.xmovement = self.sx // 20
                        self.direction = 0
                        self.cameray -= self.sy // 12
                        p[-2] = -1
                    elif (p[2] == self.platformTypeAfterLucky or p[2] == self.platformTypeCastle or p[2] == self.platformTypeLucky) and self.playerCarriesFlag and not p[-2]:
                        self.playerCarriesFlag = False
                        p[-2] = True
                        self.sandcastles += 1
                    elif p[2] == self.platformTypeRaftcastle and self.playerCarriesFlag and not self.raftcastleHasFlag:
                        self.playerCarriesFlag = False
                        self.raftcastleHasFlag = True
                        self.sandcastles += 1
            if p[2] > self.platformTypeNormal and p[2] <= self.platformTypeFloating:
                if p[-1]:
                    if p[2] == self.platformTypeAfterLucky:
                        img = self.imgPlatformAfterLucky
                    elif p[2] == self.platformTypeCastle:
                        img = self.imgPlatformCastle
                    else:
                        img = self.imgPlatformGrapevine
                    p[0] += self.extrax // 10
                    if p[0] + img.get_width() > self.sx + self.extrax:
                        p[-1] = False
                else:
                    p[0] -= self.extrax // 10
                    if p[0] <= 0:
                        p[-1] = True

    def drawPlatforms(self):
        for p in self.platforms:
            if p[2] == self.platformTypeSand:
                self.screen.blit(self.imgPlatformSand[p[-1]], (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeGrass:
                self.screen.blit(self.imgPlatformGrass[p[-1]], (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeWater:
                self.screen.blit(self.imgPlatformWater[p[-1]], (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeGrapevine:
                self.screen.blit(self.imgPlatformGrapevine, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeAfterLucky:
                if p[-2]:
                    self.screen.blit(self.imgFlagRight, (p[0] + 47, p[1] - 12 - self.cameray))
                self.screen.blit(self.imgPlatformAfterLucky, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeCastle:
                if p[-2]:
                    self.screen.blit(self.imgFlagRight, (p[0] + self.imgPlatformCastle.get_width() - 16, p[1] - 4 - self.cameray))
                self.screen.blit(self.imgPlatformCastle, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeLucky:
                if p[-2]:
                    self.screen.blit(self.imgPlatformLuckyAttacking, (p[0], p[1] - self.imgPlatformLuckyAttacking.get_height() + self.imgPlatformLuckySleeping.get_height() - self.cameray))
                    if p[-2] > 0:
                        self.screen.blit(self.imgFlagRight, (p[0] + self.imgPlatformLuckyAttacking.get_width() - 8, p[1] - 11 - self.cameray))
                else:
                    self.screen.blit(self.imgPlatformLuckySleeping, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeRaftcastle:
                if self.raftcastleHasFlag:
                    self.screen.blit(self.imgFlagRight, (p[0] + 50, p[1] - 13 - self.cameray))
                self.screen.blit(self.imgPlatformRaftcastle, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeBreaking:
                if not p[-1]:
                    self.screen.blit(self.imgPlatformBreaking, (p[0], p[1] - self.cameray))
                else:
                    self.screen.blit(self.imgPlatformBroken, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeTheEnd:
                self.screen.blit(self.imgPlatformTheEnd, (p[0], p[1] - self.cameray))
            elif p[2] == self.platformTypeWonTheGame:
                self.screen.blit(self.imgPlatformWonTheGame, (p[0], p[1] - self.cameray))

    def drawAndUpdateItems(self):
        while self.items and self.items[0][1] - self.cameray > self.sy + self.sy // 12:
            self.items.pop(0)
        for item in self.items:
            if item[2] == self.itemTypeAccelerator:
                if item[-1]:
                    imgItem = self.imgAcceleratorUsed
                else:
                    imgItem = self.imgAccelerator
            elif item[2] == self.itemTypeBeanie:
                if not item[-1]:
                    imgItem = self.imgBeanie
                else:
                    imgItem = None
            elif item[2] == self.itemTypeSnake:
                if item[-1] == -1:
                    imgItem = self.imgSnakeLeft
                elif item[-1] == 1:
                    imgItem = self.imgSnakeRight
                else:
                    imgItem = self.imgSnake
            elif item[2] == self.itemTypePrickly:
                if not item[-1]:
                    imgItem = self.imgPrickly
                else:
                    imgItem = self.imgPricklyCurled
            elif item[2] == self.itemTypeSandcastle:
                imgItem = self.imgSandcastle
                if item[-1]:
                    self.screen.blit(self.imgFlagRight, (item[0] + 4, item[1] - imgItem.get_height() + 2 - self.imgFlagRight.get_height() - self.cameray))
            elif item[2] == self.itemTypeFlag:
                if not item[-1]:
                    imgItem = self.imgFlagRight
                else:
                    imgItem = None
            elif item[2] == self.itemTypePlantSand:
                imgItem = self.imgPlantSand[item[-1]]
            elif item[2] == self.itemTypePlantGrass:
                imgItem = self.imgPlantGrass[item[-1]]
            if imgItem:
                self.screen.blit(imgItem, (item[0], item[1] - imgItem.get_height() - self.cameray))
            if not item[-1]:
                if pygame.Rect(item[0], item[1] - imgItem.get_height(), imgItem.get_width(), imgItem.get_height()).colliderect(pygame.Rect(self.playerx, self.playery, self.imgPlayerRightUp.get_width(), self.imgPlayerRightUp.get_height())):
                    if item[2] == self.itemTypeAccelerator:
                        self.jump = self.sy // 12
                        self.cameray -= self.sy // 12
                        item[-1] = True
                    elif item[2] == self.itemTypeBeanie and not self.playerWearsBeanie:
                        self.playerWearsBeanie = True
                        item[-1] = True
                    elif item[2] == self.itemTypeSnake:
                        if self.playerx + self.imgPlayerRightUp.get_width() // 2 < item[0] + self.imgPlatformGrass[0].get_width() // 2:
                            self.xmovement = -self.sx // 30
                            self.direction = 0
                            self.cameray -= self.sy // 12
                            item[-1] = -1
                        else:
                            self.xmovement = self.sx // 30
                            self.direction = 0
                            self.cameray -= self.sy // 12
                            item[-1] = 1
                    elif item[2] == self.itemTypePrickly:
                        item[-1] = True
                    elif item[2] == self.itemTypeSandcastle and self.playerCarriesFlag:
                        self.playerCarriesFlag = False
                        item[-1] = True
                        self.sandcastles += 1
                    elif item[2] == self.itemTypeFlag and not self.playerCarriesFlag:
                        self.playerCarriesFlag = True
                        item[-1] = True

    def generateInitialPlatforms(self):
        while self.platforms[-1][1] > - self.sy // 6:
            self.generateNewPlatform()

    def drawGrid(self):
        for x in range(80):
            pygame.draw.line(self.screen, (222,222,222), (x * 12, 0), (x * 12, self.sy))
            pygame.draw.line(self.screen, (222,222,222), (0, x * 12), (self.sx, x * 12))

    def waitForIt(self, its):
        run = False
        while not run:
            self.clock.tick(self.speed)
            event = pygame.event.poll()
            if event.type == KEYDOWN:
                key = pygame.key.get_pressed()
                if key[K_ESCAPE]:
                    sys.exit()
                for it in its:
                    if key[it]:
                        return it

    def showScore(self):
        line1 = self.font.render("Press ENTER to restart,", -1, (0, 0, 0))
        line2 = self.font.render("ESC to quit.", -1, (0, 0, 0))
        w = max(line1.get_width(), line2.get_width())
        h = line1.get_height() + line2.get_height()
        dx = 10
        dy = 5
        pygame.draw.rect(self.screen, (255,255,255), ((self.sx - w) // 2 - dx, (self.sy - h) // 2 - dy, w + 2 * dx, h + 2 * dy))
        pygame.draw.rect(self.screen, (0,0,0), ((self.sx - w) // 2 - dx, (self.sy - h) // 2 - dy, w + 2 * dx, h + 2 * dy), 3)
        self.screen.blit(line1, ((self.sx - line1.get_width()) // 2, self.sy // 2 - line1.get_height()))
        self.screen.blit(line2, ((self.sx - line2.get_width()) // 2, self.sy // 2))
        pygame.display.flip()
        self.waitForIt([K_RETURN])

    def run(self):
        if len(sys.argv) > 1:
            self.filename = sys.argv[1]
        else:
            self.filename = None
        self.reset()
        while True:
            self.screen.fill((255,255,255))
            self.clock.tick(self.speed)
            for event in pygame.event.get():
                if event.type == QUIT:
                    sys.exit()
                elif event.type == KEYDOWN:
                    key = pygame.key.get_pressed()
                    if key[K_ESCAPE]:
                        sys.exit()
                    elif key[K_e]:
                        if pygame.key.get_mods() & KMOD_CTRL:
                            self.eternal = not self.eternal
                    elif key[K_f]:
                        if pygame.key.get_mods() & KMOD_CTRL:
                            self.playerCarriesFlag = not self.playerCarriesFlag
                    elif key[K_b]:
                        if pygame.key.get_mods() & KMOD_CTRL:
                            self.playerWearsBeanie = not self.playerWearsBeanie
                    elif key[K_SPACE]:
                        while self.waitForIt([K_SPACE, K_s]) == K_s:
                            self.saveGame()
                    elif key[K_s]:
                        self.saveGame()
            self.drawGrid()
            self.drawPlatforms()
            self.drawAndUpdateItems()
            self.updatePlayer()
            self.updatePlatforms()
            self.screen.blit(self.font.render(str(self.score), -1, (0, 0, 0)), (self.sx // 32, self.sy // 24))
            for i in range(0, self.sandcastles):
                self.screen.blit(self.imgFlagRight, (self.sx // 32 + 10 * i, self.sy // 8))
            if self.playery - self.cameray > self.sy * 7 // 6:
                if self.eternal:
                    self.jump = self.gravity
                    self.gravity = 0
                else:
                    self.showScore()
                    self.reset()
            pygame.display.flip()

MolpyUp().run()
and this is the additional arrow picture molpArrow.png:
molpArrow.png
molpArrow.png (129 Bytes) Viewed 16598 times
.

Redundant:
Spoiler:
molpy_up_arrow.png
molpArrow.png
molpArrow.png (129 Bytes) Viewed 16598 times
BFTF replay
Good luck, my blitzing friends!
BTTBAA:1023 # Mustard? Use the mirror! Blitzing? Also use the mirror! And here's why. # OTT facebug copy
that's a robot so it doesn't countImage
This text was autogenerated:
swimming unit detector active

User avatar
BlitzGirl
Posts: 8999
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Both Present and Past...... Schizoblitz: 115/2601 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Thu Apr 05, 2018 3:26 am UTC

Molpy very up.
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<-Blog
~.Image~.FAQ->Image

User avatar
ZoomanSP
Posts: 1819
Joined: Sun May 26, 2013 11:23 am UTC
Location: Twelve days north of the Othercomic threads, and a few degrees south of complete insanity. (©yappo)

Re: 1190: "Time"

Postby ZoomanSP » Thu Apr 05, 2018 3:39 am UTC

Wait on.

Image
Spoiler:
Kieryn wrote:They have a culture involving hat wearing. What kind of a collective would come up with such a thing!?
BlitzGirl wrote:I'll get the razor and finish off Occam while we're at it.
ucim / Megan wrote:"It can do whatever it wants. It's the OTT."

User avatar
mscha
Posts: 6879
Joined: Tue Mar 26, 2013 10:21 pm UTC
Location: NL
Contact:

1190: "Time" - Time Revisited - np385

Postby mscha » Thu Apr 05, 2018 4:10 am UTC

ROLLUNGS...
Image
Spoiler:
Wait for it.
(Colorization by ucim.)

Replay Time live here!

OTT Time Travel

AUTOMOME wrote:MY S&M IS PROBLEMATIC

-- posted by oldpixbot

User avatar
ZoomanSP
Posts: 1819
Joined: Sun May 26, 2013 11:23 am UTC
Location: Twelve days north of the Othercomic threads, and a few degrees south of complete insanity. (©yappo)

Re: 1190: "Time"

Postby ZoomanSP » Thu Apr 05, 2018 4:23 pm UTC

RELATED news.
Wait on.

Image
Spoiler:
Kieryn wrote:They have a culture involving hat wearing. What kind of a collective would come up with such a thing!?
BlitzGirl wrote:I'll get the razor and finish off Occam while we're at it.
ucim / Megan wrote:"It can do whatever it wants. It's the OTT."

User avatar
addams
Posts: 9967
Joined: Sun Sep 12, 2010 4:44 am UTC
Location: Oregon Coast: 97444

Re: 1190: "Time"

Postby addams » Thu Apr 05, 2018 5:36 pm UTC

ZoomanSP wrote:RELATED news.
AHH! So Scary!
Spoiler:
I live in an area with Cats that stalk and eat Deer and Humans.
I was stalked by a Mountain Lion, one time. Very Scary...

It is not wise to hike alone.
Locals Know to take chatty friends or a couple of Dogs.

I think SBN lives in Gator country.
Gators are scary, too.

Gators are not nearly as large nor as dangerous as Crocodiles.
OOoowwooOOoowwooOO...
That scary haunted house sound is everywhere in my world, today.
A WindStorm is blowing in.

First, it makes an eerie sound.
Then, it picks up snd Blows!
Spoiler:
Then, my neighbors bring me things I forgot to tie down.


I'm so sorry...
I don't understand most of your HotDogs with Mustard.

I Do understand the hazards of Mopies;
Both tame and loving and wild and dangerous.
Life is, just, an exchange of electrons; It is up to us to give it meaning.

We are all in The Gutter.
Some of us see The Gutter.
Some of us see The Stars.
by mr. Oscar Wilde.

Those that want to Know; Know.
Those that do not Know; Don't tell them.
They do terrible things to people that Tell Them.

User avatar
BlitzGirl
Posts: 8999
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Both Present and Past...... Schizoblitz: 115/2601 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Fri Apr 06, 2018 1:27 am UTC

ZoomanSP wrote:RELATED news.
BBC Article wrote:A young Indian woman was lucky to survive, doctors say, after she fought off a tiger which attacked her goat.

Image = Image
Do we call him Cuegoat or Goatball?
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<-Blog
~.Image~.FAQ->Image

User avatar
karhell
Posts: 687
Joined: Wed Jun 19, 2013 4:56 pm UTC
Location: Breizh

Re: 1190: "Time"

Postby karhell » Fri Apr 06, 2018 7:01 am UTC

I vote for Cuegoat. Goatball sounds more like some weird farmland sport
AluisioASG wrote:191 years ago, the great D. Pedro I drew his sword and said: "Indent thy code or die!"
lmjb1964 wrote:We're weird but it's okay.
ColletArrow, katakissa, iskinner, thunk, GnomeAnne, Quantized, and any other Blitzers, have fun on your journey!

User avatar
Rakhal
Posts: 83
Joined: Sat Dec 12, 2015 11:14 am UTC

Re: 1190: "Time"

Postby Rakhal » Fri Apr 06, 2018 7:59 am UTC

Ah, Megan gets the first inkling that the sea is doing something weird...

--Rakhal

User avatar
SilentTimer
Posts: 1065
Joined: Fri Nov 08, 2013 8:40 pm UTC
Location: secret base on the Moon

Re: 1190: "Time"

Postby SilentTimer » Fri Apr 06, 2018 8:54 am UTC

Rakhal wrote:Ah UNG, Megan gets the first inkling that the sea is doing something weird...

Image
Spoiler:
Wait for it.
Hi, Rakhal! Image FTFY.

Speaking of UNGs, ...
oldpixbot wrote:UNGLOCENTRIST...
Hi, oldpixbot! Image Nice to have you back!
mscha wrote:A bit late, but...
Happy annUNGversery, y'otters!
Hi, mscha! Image
Thank you for showing up, for bringing back oldpixbot, and for keeping up your resourceful web site.
And for the flowers. Image

taixzo wrote:I note that the molpy image specifically was drawn by BlitzGirl, not by GLR, so perhaps that could be relicensed? As for the other textures, I'd be willing to try and re-draw them - I do have a bit of practice drawing things in the Time style now.
Hi, taixzo! Image
Count me in! Image Large parts of t1i are entirely by myself, including grass, molpies, etc.
I can tell you which parts. Feel free to use them in the hotdog.
Last edited by SilentTimer on Fri Apr 06, 2018 9:34 am UTC, edited 3 times in total.
Image Did you like 1190: Time?
Then you will like its sequel: t1i. [Discussion] [Making Of]
ucim wrote:I consider it to be canon.

503? Images don't work? Other mustard? Visit the ЯOЯЯIM!

Randalspeed to Rakhal, thunk, and all Blitzers!

    Help addams!

User avatar
mscha
Posts: 6879
Joined: Tue Mar 26, 2013 10:21 pm UTC
Location: NL
Contact:

1190: "Time" - Time Revisited - np414

Postby mscha » Fri Apr 06, 2018 9:10 am UTC

BREAKDANCUNGS...
Image
Spoiler:
Wait for it.
(Colorization by ZoomanSP.)

Replay Time live here!

OTT Time Travel

AUTOMOME wrote:REDUNDANCY IS KEYBOARD-SMASHING

-- posted by oldpixbot

User avatar
ZoomanSP
Posts: 1819
Joined: Sun May 26, 2013 11:23 am UTC
Location: Twelve days north of the Othercomic threads, and a few degrees south of complete insanity. (©yappo)

Re: 1190: "Time"

Postby ZoomanSP » Fri Apr 06, 2018 3:09 pm UTC

Wait on.

Image
Spoiler:
Kieryn wrote:They have a culture involving hat wearing. What kind of a collective would come up with such a thing!?
BlitzGirl wrote:I'll get the razor and finish off Occam while we're at it.
ucim / Megan wrote:"It can do whatever it wants. It's the OTT."

User avatar
lmjb1964
Posts: 2366
Joined: Mon Apr 04, 2011 7:09 pm UTC
Location: In the Present! Need to ketchup NP 2236-2280, plus NP 2026-2058 and something like 2060-2090+?.

Re: 1190: "Time"

Postby lmjb1964 » Fri Apr 06, 2018 7:54 pm UTC

karhell wrote:I vote for Cuegoat. Goatball sounds more like some weird farmland sport

Hopefully one where the goats are kicking the ball, not where they're being used as a ball. :cry:

Unlike Cueball, the poor goat did not survive the attack. I guess they were out of panther salve, though fortunately she did have her thwapstick.

Belated for decree: Thank you, The Netherlands! And, while I'm at it, New Netherlands.

Weather report: The rain is back. It's good, we need a little more before the dry season starts.

Speaking of seasons, it's tax season, and I have done not one whit of my taxes. Hopefully they have wi-fi in the federal prison, so I can continue OTTing while locked up for tax evasion...
Image

Help addams stay in her home! https://www.crowdrise.com/in-a-comically-tragic-turn-of-events-addams-didnt-die
Imagesmiley by yappo
That's a robot but it totally counts. Image

bot by balthasar_s

User avatar
BlitzGirl
Posts: 8999
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Both Present and Past...... Schizoblitz: 115/2601 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Sat Apr 07, 2018 5:22 am UTC

lmjb1964 wrote:
karhell wrote:I vote for Cuegoat. Goatball sounds more like some weird farmland sport

Hopefully one where the goats are kicking the ball, not where they're being used as a ball. :cry:

I think in this newfound farmsport, the idea is for the keyboard to be used as a ball.
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<-Blog
~.Image~.FAQ->Image

User avatar
GnomeAnne
Posts: 541
Joined: Sat Sep 03, 2016 12:35 am UTC
Location: [center][img]http://forums.xkcd.com/download/file.php?id=54350&t=1[/img]

Re: 1190: "Time"

Postby GnomeAnne » Sat Apr 07, 2018 3:01 pm UTC

There is a sport called Buzkashi played on horseback where the players carry a goat or calf and attempt to place it on the opposing team's goal alter.
Wait For It.

User avatar
Rakhal
Posts: 83
Joined: Sat Dec 12, 2015 11:14 am UTC

Re: 1190: "Time"

Postby Rakhal » Sat Apr 07, 2018 3:47 pm UTC

I'll have you know that I've watched EVERY goatball game played in my home town for the last 10 years! It's a very important part of my life...

--Rakhal


Return to “Individual XKCD Comic Threads”

Who is online

Users browsing this forum: No registered users and 31 guests