aboutsummaryrefslogtreecommitdiffstats
path: root/evil_puppy/fluffy_puppy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'evil_puppy/fluffy_puppy.cpp')
-rw-r--r--evil_puppy/fluffy_puppy.cpp195
1 files changed, 195 insertions, 0 deletions
diff --git a/evil_puppy/fluffy_puppy.cpp b/evil_puppy/fluffy_puppy.cpp
new file mode 100644
index 0000000..821df27
--- /dev/null
+++ b/evil_puppy/fluffy_puppy.cpp
@@ -0,0 +1,195 @@
+/*
+ * The most evil virus of all time.
+ * Please mod this virus and make it as bad as possable.
+*/
+
+// Fltk header.
+#include "FL/Fl.H"
+#include "FL/Fl_Double_Window.H"
+#include "FL/Fl_PNG_Image.H"
+#include <FL/Fl_Box.H>
+#include <FL/Fl_Output.H>
+#include <FL/Enumerations.H>
+
+// C/C++ libary.
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <random>
+
+using namespace std;
+
+// Make sure the path ends in '/' or '\' on windows.
+#define main_dir "./"
+#define image_name "dog.png"
+//#define make_fullscreen
+
+// Random range.
+#define range_min 3
+#define range_max 15
+
+// Global Varibles.
+int rub_time;
+Fl_Double_Window * win;
+Fl_Box * the_dogs_msg;
+Fl_Box * longer_box;
+Fl_Output * output_box;
+
+int funny_strings_size = 3;
+const char funny_strings[][25] = {
+ "You know you want to. ",
+ "The puppy is waiting. ",
+ "You don't have a choice."
+};
+
+int random_range(int x, int y) {
+ random_device rd;
+ mt19937 gen(rd());
+ uniform_int_distribution<> distr(x, y);
+
+ return distr(gen);
+}
+
+const char * random_msg() {
+ return funny_strings[random_range(0, funny_strings_size - 1)];
+}
+
+class DogBox : public Fl_Box {
+ public:
+ DogBox(int X, int Y, int W, int H, const char * l=0) :
+ Fl_Box(X, Y, W, H, l) {
+ started = 0;
+ failes = 0;
+ }
+
+ int handle(int event);
+ private:
+ time_t started;
+ int failes;
+};
+
+int DogBox::handle(int event) {
+ switch(event) {
+ case FL_PUSH:
+ return 1;
+ case FL_RELEASE:
+ if (time(NULL) - started >= rub_time && started)
+ win->hide();
+
+ started = 0;
+
+ if (failes == 2) {
+ const char msg_format[] = "At least %d seconds for this dog.";
+ char the_msg[strlen(msg_format) + 3];
+
+ sprintf(the_msg, msg_format, rub_time);
+ output_box->value(the_msg);
+ failes = 3;
+ return 1;
+ } else if (failes >= 3)
+ return 1;
+
+ // Make sure the value changes.
+ char old_value[255], new_value[255];
+ memset(old_value, 0, sizeof(old_value));
+ strcat(old_value, output_box->value());
+
+ while (true) {
+ memset(new_value, 0, sizeof(new_value));
+ strcat(new_value, random_msg());
+
+ if (strcmp(old_value, new_value))
+ break;
+ }
+
+ output_box->value((const char*)new_value);
+ longer_box->show();
+ failes++;
+ return 1;
+ case FL_DRAG:
+ if (!started)
+ started = time(NULL);
+
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+void window_callback(Fl_Widget * w, void * d) {
+ output_box->value("You can't close me!");
+}
+
+int main(int argv, char ** args) {
+ rub_time = random_range(range_min, range_max);
+
+ // Getting screen size.
+ int screen_width, screen_height, x, y;
+ Fl::screen_xywh(x, y, screen_width, screen_height);
+
+ // Opening dog image file.
+ char image_path[255];
+ sprintf(image_path, "%s%s", main_dir, image_name);
+ Fl_PNG_Image * dog_image = new Fl_PNG_Image((const char*)image_path);
+
+ if (dog_image->fail()) {
+ fprintf(stderr, "Couldn't load '%s'.\n", image_path);
+ return 1;
+ }
+
+ // Currenting image and widgets.
+ int dWidth, dHeight;
+ int cur_x, cur_y;
+ dWidth = dog_image->w();
+ dHeight = dog_image->h();
+ cur_x = (screen_width / 2) - dWidth;
+ cur_y = (screen_height / 2) - dHeight;
+
+#ifndef make_fullscreen
+ screen_width = dWidth * 2;
+ screen_height = dHeight * 2;
+ cur_x = 0;
+ cur_y = 0;
+#endif
+
+ // Opening window.
+ win = new Fl_Double_Window(screen_width, screen_height, "Rub my belly");
+
+ // Dog box.
+ Fl_Box * dog_box = new DogBox(dWidth / 2 + cur_x,
+ dHeight / 2 + cur_y, dWidth, dHeight);
+ dog_box->image(dog_image);
+
+ // Text.
+ const char the_msg[] = "Rub my belly!";
+ int text_size = dWidth / strlen(the_msg) * 1.5;
+
+ the_dogs_msg = new Fl_Box(dog_box->x(), text_size + cur_y,
+ dWidth, text_size + 10, the_msg);
+ the_dogs_msg->box(FL_ROUNDED_BOX);
+ the_dogs_msg->labeltype(FL_SHADOW_LABEL);
+ the_dogs_msg->labelsize(text_size);
+
+ text_size /= 2;
+ output_box = new Fl_Output(dog_box->x(),
+ the_dogs_msg->h() + the_dogs_msg->y() + 10,
+ dWidth, text_size + 10);
+ output_box->labelsize(text_size);
+ output_box->value(random_msg());
+
+ // Longer box.
+ text_size *= 2;
+ longer_box = new Fl_Box(5 + cur_x, 5 + cur_y, 5 * text_size, text_size + 10, "Longer!");
+ longer_box->labelsize(text_size);
+ longer_box->hide();
+
+ win->end();
+ win->callback(window_callback);
+
+#ifdef make_fullscreen
+ win->fullscreen();
+#endif
+
+ win->show(argv, args);
+ return Fl::run();
+}